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

news/2024/9/23 10:48:20/

一、文件上传

前端:

<%@ 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/news/1439938.html

相关文章

C++ Primer Plus

第一章 初始C #include <iostream> //#:预处理int main(void) //void:无参数 {using namespace std;int carrots; //定义声明语句:开辟内存空间&#xff0c; int:整型 cout << "how many corrots do you have?" << endl; //cout:输出流(out) end…

C语言Linux vim shell命令

无论是在插入模式或者是其他模式下对于文件的修改都是对于内存缓冲区进行修改&#xff0c;只有当点击w进行保存以后才会将数据写入到一个新的文件中的&#xff0c;将源文件删除&#xff0c;并且新文件改为文件的名字 1. actionmotion dG删到文件尾 ggdG先到开头再删除到末尾…

微信小程序:12.页面导航

什么是页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现的页面导航的方式有两种&#xff1a; 连接location.href 小程序中实现页面导航的两种方式 声明式导航 在页面上声明一个导航组件 通过点击组件实现页面跳转 导航TabBar页面 是指配置TabB…

公钥密码学Public-Key Cryptography

公钥或非对称密码学的发展是整个密码学历史上最伟大的&#xff0c;也许是唯一真正的革命。The development of public-key, or asymmetric, cryptography is the greatest and perhaps the only true revolution in the entire history of cryptography. 公钥算法基于数学函数…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

【计算机毕业设计】基于SSM++jsp的校园快递代取系统【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 目的和意义 1.3 论文结构安排 2 相关技术 2.1 SSM框架介绍 2.2 B/S结构介绍 2.3 Mysql数据库介绍 3 系统分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 运行可行性分析 3.2 系统性能分析 3.2.1 易用性指标 3.2.2 可…

Git命令查询

Git拥有众多命令&#xff0c;以下是一份更全面的Git命令列表&#xff1a; 配置与初始化 git config: 配置 Git 工具。git init: 初始化一个新的 Git 仓库。git clone: 克隆一个仓库到本地。 基本操作 git add: 将文件添加到暂存区。git status: 查看工作区、暂存区和本地仓库的…

Linux防火墙相关命令以及ip白名单配置

Linux防火墙相关命令以及ip白名单配置 firewall防火墙基础命令查看防火墙的服务状态查看防火墙的状态服务的开启、关闭和重启查看防火墙规则端口的查询、开放和关闭重启防火墙 防火墙白名单配置部分参数介绍 firewall防火墙基础命令 查看防火墙的服务状态 systemctl status f…