查看: 155|回复: 0

SpringMVC 文件的上传、下载

[复制链接]
发表于 2020-2-3 00:10:27 | 显示全部楼层 |阅读模式
文件上传

(1)下载添加2个jar包


  • commons-fileupload.jar
  • commons-io.jar
SpringMVC的文件上传依靠于Apache的FileUpload组件,需要下载添加2个jar包,下载地点:
http://commons.apache.org/proper/commons-fileupload/
http://commons.apache.org/proper/commons-io/


(2)表单
  1.       选择文件:
  2.     上传  
复制代码
multiple用于文件多选,不使用multiple则只能选择一个文件。


(3)controller
  1. @org.springframework.stereotype.Controllerpublic class FileUploadController{    @RequestMapping("/fileUpload")    public String fileUpload(@RequestParam("uploadFile") List fileList, HttpServletRequest request) {        //如果用户上传了文件        if (!fileList.isEmpty() && fileList.size()>0){            System.out.println(fileList.isEmpty());            System.out.println(fileList.size());            //设置生存路径为项目根目录下的upload文件夹            String savePath = request.getServletContext().getRealPath("/upload");            //不存在就新建            File saveDir = new File(savePath);            if (!saveDir.exists()){                saveDir.mkdirs();            }            //循环读取上传文件并生存            for (MultipartFile file:fileList){                //原文件名                String originalFilename = file.getOriginalFilename();                //使用uuid防止文件重名,因为原文件名中包含扩展名,只能放最背面                String newFilename= UUID.randomUUID()+"_"+originalFilename;                System.out.println(originalFilename);                //将临时文件生存至指定目录                try {                    file.transferTo(new File(saveDir+"/"+newFilename));                } catch (IOException e) {                    e.printStackTrace();                    return "error";                }            }            return "success";        }        //如果用户未上传文件,返回error        return "error";    }}
复制代码
SpringMVC用MultipartFile来封装上传文件,一个MultipartFile对应一个上传文件。


(4)SpringMVC的配置文件
  1.                                                                                                             
复制代码
只需配置MultipartResolver。




文件下载

(1)前端传递文件名
  1. [url=https://www.mfsun.com/${pageContext.request.contextPath}/download?filename=1.jpg]下载文件[/url]
复制代码


(2)controller
  1. @org.springframework.stereotype.Controllerpublic class DownloadController{    @RequestMapping("/download")    public ResponseEntity fileDownload(HttpServletRequest request,String filename) throws IOException {        //指定存放文件的路径,此路径是在部署项目下,/表示部署项目的根路径        String dir=request.getServletContext().getRealPath("/files");        File file = new File(dir + "/" + filename);        //设置相应头        HttpHeaders httpHeaders = new HttpHeaders();        //通知浏览器以下载的方式处理惩罚,第二个参数指定文件名        httpHeaders.setContentDispositionFormData("attachment", filename);        //以流的情势返回        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);        //读取目标文件        byte[] arr = FileUtils.readFileToByteArray(file);        //创建ResponseEntity对象并返回。目标文件的byte[]、HttpHeaders、Http状态码        return new ResponseEntity(arr, httpHeaders, HttpStatus.OK);    }}
复制代码

读取目标文件为byte[ ],使用的FileUtils是commons-io.jar中的类,所以要添加commons-io.jar。

也可以使用jdk自带的方式读取目标文件为byte[ ]:
  1.     FileInputStream fileInputStream = new FileInputStream(file);    byte[] arr = fileInputStream.readAllBytes();
复制代码
不需要添加额外的jar包。




解决下载文件,中文文件名乱码的问题

上面的代码,如果文件名中有中文,文件名会乱码。

原因在于此句代码中的文件名未指定编码字符集:

  1. httpHeaders.setContentDispositionFormData("attachment", filename);
复制代码
浏览器拿到文件名,发现没有指定字符集,就使用浏览器默认的字符集,
许多浏览器的默认字符集是ISO-8859,不包含中笔墨符,无法处理惩罚文件名里的中文,从而文件名乱码。


解决方式:
  1. httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(filename,"utf-8"));
复制代码
对文件名使用utf-8编码。

此种方式只对部分浏览器有用。
不同的浏览器,默认的编码字符集大概不同,解决方式也大概不同,需要根据User-Agent(浏览器内核)来分别处理惩罚。

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表