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

一、文件上传

前端:

<%@ 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://xiahunao.cn/news/2979572.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

指令和界面【Linux】

指令和界面 前言一、指令 vs 界面交互的需求满足需求的第一阶段——指令满足需求的第二阶段-界面时间 二、指令和界面交互区别为什么要学命令行总结 前言 Linux操作系统提供了丰富的命令行界面和图形用户界面工具&#xff0c;用户可以根据自己的需求选择适合的界面进行操作。命…

【编程Tool】小熊猫C/C++的安装使用及配置保姆级教程

目录 1.软件介绍 2.软件下载地址 3.安装 3.1.下载得到可执行文件 3.2. 双击可执行文件等待下载 3.3. 选择语言 3.4. 阅读协议并点击我接受 3.5. 组件保持默认并点击下一步(N) 3.6. 更换安装路径 3.7. 等待安装 3.8. 点击完成 4.配置及使用 4.1. 选择主题及语言 4.2. 进入默认界…

拼多多面试题——力扣版测试用例纠错

最近我看到力扣上这个题目&#xff0c;用了三种方法&#xff0c;结果没有一种正确&#xff0c;我就纳闷儿了&#xff0c;为何总有一个测试用例过不了&#xff0c;结果我发现这个测试用例确实有问题啊。。。。。 题目&#xff1a; 表&#xff1a;Logs ----------------------…

架构师系列-MYSQL调优(八)- 索引多表优化案例

用户手机认证表 该表约有11万数据,保存的是通过手机认证后的用户数据关联字段: user_id CREATE TABLE mob_autht (id int(11) NOT NULL AUTO_INCREMENT COMMENT 标识,user_id int(11) NOT NULL COMMENT 用户标识,mobile varchar(11) NOT NULL COMMENT 手机号码,seevc_pwd varc…

图像处理技术与应用(一)

图像处理技术与应用入门 使用skimage进行图像读取和显示 skimage库&#xff08;Scikit-image&#xff09;提供了一个强大的工具集&#xff0c;用于执行各种图像处理任务。以下是如何使用skimage读取和显示图像的基本示例&#xff1a; from skimage import ioimg io.imread(…

LLama的激活函数SwiGLU 解释

目录 Swish激活函数 1. Swish函数公式 LLaMA模型中的激活函数 1. SwiGLU激活函数 2. SwiGLU激活函数的表达式 3. SwiGLU激活函数的优势 Swish激活函数 Swish是一种激活函数&#xff0c;其计算公式如下&#xff1a; 1. Swish函数公式 Swish(x) x * sigmoid(x) 其中&am…

【CMake】CMake从入门到实战系列(十)——CMake中的条件语句和循环语句

文章目录 前言一、条件语句1、if 语句【1】基本语法【2】参数含义【3】示例 二、循环语句1、foreach 循环foreach 循环之 基本用法【1】基本语法【2】参数含义【3】示例 foreach 循环之 RANGE 关键字【1】基本语法【2】参数含义【3】示例 foreach 循环之 IN 关键字【1】基本语法…

什么是大语言模型以及如何构建自己的大型语言模型?

一、关于大语言模型 LLM 对于无数的应用程序非常有用&#xff0c;如果我们自己从头开始构建一个&#xff0c;那我们可以了解底层的ML技术&#xff0c;并可以根据特定需求定制LLM&#xff0c;但是对资源的需求巨大。大型语言模型是一种 ML 模型&#xff0c;可以执行各种自然语言…

Quartz - 任务调度

文章目录 关于 QuartzQuartz的体系结构核心概念设计模式 常用API基本使用 关于 Quartz 官网&#xff1a;https://www.quartz-scheduler.orggithub : https://github.com/quartz-scheduler/quartz文档&#xff1a;https://www.quartz-scheduler.org/documentation/ 相关教程/博…

autodesk系列软件打开提示Flexnet License Finder

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展功能&#xff0c;输入flex&#xff0c;点击搜索 选择对应的这个按钮&#xff0c;点击&#xff0c;提示修复成功即可尝试打开软件

深入学习Linux中的“文件系统与日志分析”

目录 1.文件系统的组成 1.1inode和block 1.2inode的内容 1.3inode的号码 ​1.4文件存储小结 ​1.5inode大小 1.6inode的特殊作用 2. 链接文件 3.文件恢复 3.1EXT类型文件恢复 3.2磁盘有空间&#xff0c;但是仍然无法写入新文件 3.3恢复XFS类型的文件 3.3.1xfsdump…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

vue【vuex状态管理】

1&#xff1a;vuex是什么&#xff1a; vuex是一个状态管理工具&#xff0c;状态就是指的数据&#xff0c;可以将数据存放到vuex中以供其他组件使用时进行调用 2&#xff1a;应用场景&#xff1a; ①&#xff1a;像用户登录客户端&#xff0c;这个用户的数据需要在多个组件中…

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

Linux多进程(一)创建进程与进程控制

一、进程状态 进程一共有五种状态分别为&#xff1a;创建态&#xff0c;就绪态&#xff0c;运行态&#xff0c;阻塞态(挂起态)&#xff0c;退出态(终止态)其中创建态和退出态维持的时间是非常短的&#xff0c;稍纵即逝。主要是就绪态, 运行态, 挂起态三者之间的状态切换。 就绪…

ABB机器人IRB4400平衡缸维修小技巧

ABB平衡缸是机器人是一个不可忽视的重要组成部分。ABB机器人平衡缸通常采用高强度材料制造&#xff0c;设计精巧&#xff0c;方便地集成到IRB4400机器人手臂中。此外&#xff0c;平衡缸还具备良好的密封性能&#xff0c;防止气体或液体泄漏&#xff0c;确保其耐用性和稳定性。因…

Mac电脑清理微信聊天记录 Mac电脑微信缓存怎么删

细心网友突然发现微信已经成为占用电脑存储空间最大的软件&#xff0c;其中包括聊天记录、缓存的文件、图片、视频等等&#xff0c;少则几个G&#xff0c;多则十几个G&#xff0c;让原本就不富裕的Mac存储空间更是雪上加霜。mac电脑清理微信聊天记录成为大家迫切解决的问题&…

MySQL文件目录结构:表在文件系统中的表示

以下内容基于Linux系统&#xff0c;MySQL的 /var/lib/mysql/ 目录下的数据文件 &#x1f496; Innodb 引擎 MySQL 5.7 MySQL 8.0 &#x1f31f; 总结 Innodb 是聚簇索引&#xff0c;索引及数据&#xff0c;数据即索引&#xff0c;所以数据和索引是存储在同一个文件中的 MyS…

Java基本语法(基础部分)

Java基本语法 文章目录 Java基本语法前言一、准备工作1.1 计算机软件与硬件1.2 计算机编程语言1.3 Java语言概述&程序分析1.4 Java环境搭建&Java API1.5 Java核心机制JVM 二、变量2.1 关键字&标识符2.2 变量2.3 数据类型(基本数据类型)2.3.1 基本数据类型2.3.2 基本…

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming&#xff0c;面向切面编程)&#xff1a;是一种新的方法论&#xff0c;是对传统 OOP(Object-Oriented Programming&#xff0c;面向对象编程)的补充。 面向对象是纵向继承&#xff0c;面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…