前面一篇文章讲了:基于MAVEN项目——如何上传于下载文件
如今碰见一个问题:上传中文命名的图片,下载显示不了中文名称:
解决效果:
解决步骤:
第一步:
sping-mvc.xml部分代码:java
<!-- 上传文件的处理器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置默认编码 解决了上传文件名乱码的问题 --> <property name="defaultEncoding" value="utf-8"></property> <!-- 上传图片最大大小5M --> <property name="maxUploadSize" value="5242440"></property> </bean>
第二步:web
FileController.java中文文件名获取代码:spring
String userAgent = request.getHeader("User-Agent");//获取浏览器名(IE/Chome/firefox) if(userAgent.contains("MSIE")||userAgent.contains("Trident")) {//针对IE或IE为内核的浏览器 fileName=java.net.URLEncoder.encode(fileName,"UTF-8"); }else { fileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");//谷歌控制版本 } headers.setContentDispositionFormData("attachment", fileName);// 默认下载文件名为原始文件名
其余浏览器控制字符格式:(详细)sql
String userAgent = request.getHeader("User-Agent");//获取浏览器名(IE/Chome/firefox) if (userAgent.contains("firefox")) { fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器 } else if (userAgent.contains("MSIE")) { fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 }else if (userAgent.contains("CHROME")) { fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// 谷歌 } headers.setContentDispositionFormData("attachment", fileName);// 默认下载文件名为原始文件名
FileController.java所有代码:(我用的浏览器chome)数据库
package com.cungudafa.spingmvc01.controller; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import com.cungudafa.spingmvc01.bean.FileInfo; import com.cungudafa.spingmvc01.dao.FileInfoDao; import com.cungudafa.spingmvc01.dao.impl.FileInfoDaoImpl; import com.cungudafa.spingmvc01.util.FileUtil; /** * 处理文件的类 * * @author Administrator * */ @Controller @RequestMapping("/file") public class FileController { @RequestMapping("/uploadtest") public String upload(MultipartFile uploadFile) throws IOException { System.out.println("uploadFile = " + uploadFile); // 得到上传字节数 byte[] buf = uploadFile.getBytes(); System.out.println("上传文件大小:" + buf.length); // 得到上传文件名称 System.out.println("上传文件名称getName = " + uploadFile.getName()); System.out.println("上传文件名称getOriginalFilename = " + uploadFile.getOriginalFilename()); return "index"; } @RequestMapping("/upload") public String toUpload() { return "upload"; } @RequestMapping("/files") public String files(HttpSession session) { FileInfoDao dao = new FileInfoDaoImpl(); try { List<FileInfo> files = dao.findFiles();// 查找数据库所有内容 session.setAttribute("list", files);// 所有文件显示页面,用list能够调出数据库表 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "files"; } @RequestMapping("/doUpload") public String upload(MultipartFile uploadFile, HttpServletRequest request) throws IOException { System.out.println("uploadFile = " + uploadFile); // 得到文件 byte[] buf = uploadFile.getBytes(); System.out.println("文件长度" + buf.length); // 文件名 System.out.println("文件名getName = " + uploadFile.getName()); System.out.println("文件名getOriginalFilename = " + uploadFile.getOriginalFilename()); // 文件名 a.txt String originalFileName = uploadFile.getOriginalFilename(); // 时间戳 String time = FileUtil.createFileTimestamp(); // 文件url /upload/1231231231231a.txt String fileUrl = "/upload/" + time + originalFileName; fileUrl = request.getServletContext().getRealPath(fileUrl); System.out.println("fileUrl = " + fileUrl); // 向url地址存储文件 FileUtil.writeFileToUrl(uploadFile, fileUrl); // 向数据库中保存文件信息 FileInfo fileInfo = new FileInfo(); fileInfo.setFileName(originalFileName); fileInfo.setFileUrl(fileUrl); FileInfoDao dao = new FileInfoDaoImpl(); try { dao.addFileInfo(fileInfo); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "user"; } @RequestMapping("/download") public ResponseEntity<byte[]> download(Integer fileId,HttpServletRequest request) { FileInfoDao dao = new FileInfoDaoImpl(); try { FileInfo fileInfo = dao.findFileById(fileId);// 按学号查找文件记录类 String fileUrl = fileInfo.getFileUrl(); String fileName = fileInfo.getFileName(); HttpHeaders headers = new HttpHeaders();// http协议 String userAgent = request.getHeader("User-Agent"); if(userAgent.contains("MSIE")||userAgent.contains("Trident")) { fileName=java.net.URLEncoder.encode(fileName,"UTF-8"); }else { fileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1"); } headers.setContentDispositionFormData("attachment", fileName);// 默认下载文件名为原始文件名 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);// 媒体流下载 ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(fileUrl)), headers, HttpStatus.CREATED);// 二进制转换为实体类型 return entity; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }