SpringMVC中的文件上传和中英文名称文件下载

embedded/2024/12/22 21:24:30/

一、文件上传

前端:

<%@ page language="java" contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"  content="text/html; charset=UTF-8">
<title>文件上传</title>
<script>
//判断是否填写上传人并已选择文件
function check(){var name = document.getElementById("name").value;var file = document.getElementById("file").value;if(name==""){alert("请填写上传人")return false;}if(file==""||file.length==0){alert("请选择上传文件")return false;}return true;
}</script>
</head>
<body><form action="${pageContext.request.contextPath }/fileUpload" method="post" enctype="multipart/form-data" onsubmit="return check()">上传人:<input id="name" type="text" name="name" /><br/>请选择文件:<input id="file" type="file" name="uploadfile" multiple="multiple" /><br/><input type="submit" value="上传"></form></body>
</html>

后端:

    /** 执行文件上传*/@RequestMapping("/fileUpload")public String fileUpload(@RequestParam("name") String name,@RequestParam("uploadfile") List<MultipartFile> uploadfile,HttpServletRequest request) {//判断文件是否存在if(!uploadfile.isEmpty()&&uploadfile.size()>0) {//循环输出上传的文件for (MultipartFile file : uploadfile) {//获取文件原始名称String originalFilename = file.getOriginalFilename();//设置上传文件的保存目录String dirPath = request.getServletContext().getRealPath("/upload/");File filePath = new File(dirPath);//如果保存文件的地址不存在,就先创建目录if(!filePath.exists()) {filePath.mkdirs();}//使用UUID重新命名上传的文件String newFilename = name+"_"+UUID.randomUUID() + "_"+originalFilename;try {//使用MultipartFile接口的方法完成文件上传到指定位置file.transferTo(new File(dirPath+newFilename));} catch (Exception e) {e.printStackTrace();return "error";}}//跳转成功页面return "success";}else {return "error";}}

二、中英文名称文件下载

如果是简单的英文文件下载不难,但是中文文件下载会出现乱码问题,所以我们利用Servlet API中提供的URLEncoder类中的encoder(String s,String enc)方法将中文转换为UTF-8编码。

注意前端在头部要添加:

<%@page import="java.net.URLEncoder"%>

前端:

<%@ page language="java" contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<%@page import="java.net.URLEncoder"%>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"  content="text/html; charset=UTF-8">
<title>文件下载</title>
</head>
<body><div><a href="${pageContext.request.contextPath }/fileDownload?filename=1.jpg">文件下载</a></div><div><a href="${pageContext.request.contextPath }/fileDownload?filename=<%=URLEncoder.encode("图片.png", "UTF-8") %>">中文文件下载</a></div>
</body>
</html>

后端:

    /** 执行文件下载*/@RequestMapping("/fileDownload" )public ResponseEntity<byte[]> fileDownload (HttpServletRequest request,String filename) throws Exception {//检查文件名是否为空if(filename ==null||filename.trim().isEmpty()) {throw new IllegalArgumentException("文件名不能为空");}//指定要下载的文件所在路径String path = request.getServletContext().getRealPath("/upload/");if(path ==null) {//处理path为空的情况throw new IOException("无法获取文件路径");}//创建该文件对象File file = new File (path+File.separator+filename) ;if(!file.exists()||!file.isFile()) {//处理文件不存在的情况throw new FileNotFoundException("请求的文件不存在");}//对文件名编码,防止中文文件乱码filename = this.getFilename(request, filename);//设置响应头org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();//通知浏览器以下载的方式打开文件headers.setContentDispositionFormData ("attachment",filename);//定义以流的形式下载返回文件数据headers.setContentType(MediaType.APPLICATION_OCTET_STREAM) ;//使用files工具类将文件转换为字节数组byte[] bytes = Files.readAllBytes(file.toPath());//返回实体对象return new ResponseEntity<> (bytes,headers,HttpStatus.OK) ;}/** 根据浏览器的不同进行编码设置,返回编码后的文件名*/public String getFilename(HttpServletRequest request,String filename) throws Exception{//IE不同版本User-Agent中出现的关键词String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};//获取请求头代理信息String userAgent = request.getHeader("User-Agent");for (String keyword : IEBrowserKeyWords) {if(userAgent.contains(keyword)) {//IE内核浏览器,统一为UTF-8编码显示return URLEncoder.encode(filename, "UTF-8");}}//火狐等其他浏览器统一为ISO-8859-1编码显示return new String(filename.getBytes("UTF-8"),"ISO-8859-1");}

一开始,不知道哪里出错,所以抛出异常处理,最终发现问题,由于我在编写前端代码时:多写空格了,如下图所示:

所以在浏览器中报错如下:

最后修改代码,完美解决。


http://www.ppmy.cn/embedded/20028.html

相关文章

Docker容器配置进阶

一、容器的自动重启 Docker提供重启策略选项控制容器退出时或Docker重启时是否自动启动该容器。重启策略能够确保关联的多个容器按照正确的顺序启动。Docker建议使用重启策略&#xff0c;并避免使用进程管理器启动容器。运行容器时可以使用--restart选项指定重启策略。容器的重…

编写一个函数fun,它的功能是:实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

php的curl请求,包含了post,get,put,delete

php的curl请求,包含了post,get,put,delete 这段代码是一个非常实用的HTTP通信工具&#xff0c;可以轻松集成到需要网络通信的PHP项目中。它提供了足够的灵活性&#xff0c;适合多种网络请求任务。 if (!function_exists("http_curl")) {/*** 发送HTTP请求* param s…

基于springboot实现美食推荐商城管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现美食推荐商城管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本美食推荐商城就是在这样的大环境下诞生&#xff0c;其可以帮助…

Pull和Push的关系以及区别

Pull&#xff08;拉取&#xff09;和Push&#xff08;推送&#xff09;是两种不同的数据传递模式 它们描述了数据生产者&#xff08;或持有者&#xff09;与数据消费者之间是如何通讯的。 Pull和Push是数据交互的两种基本方式 它们反映了数据流动的方向和主动性。 1.在Pull…

Spring响应式高并发编程

这里写目录标题 JDK基础Lambda表达式双冒号语法函数式接口 StreamApi流式处理创建流对象中间操作filter 并行流终结操作收集操作 阻塞式编程和响应式编程JUCflow 响应式流Flux流Mono流事件回调 缓冲区限流操作手动产生流自定义处理器多线程的协作与调度 JDK基础 响应式编程将大…

LM3404和LM3404HV,LED驱动器集成电路

这份文件是德州仪器&#xff08;Texas Instruments Incorporated&#xff09;关于LM3404和LM3404HV两款LED驱动器集成电路&#xff08;IC&#xff09;的数据手册。以下是其核心内容的概要&#xff1a; 产品特点: 集成1-A MOSFET宽输入电压范围&#xff08;LM3404: 6V至42V&…

Springboot+Vue项目-基于Java+MySQL的非物质文化网站设计与实现(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…