SpringMVC文件上传和下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liouyi250/article/details/79085258

1. 文件上传
SpringMVC通过MultipartResolver来实现文件上传,默认没有装配,使用MultipartResolver需要加上commons-fileupload这个jar包。
1.1 配置MultipartResolver

<!--配置上传文件控件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
      p:defaultEncoding="UTF-8"//文件编码
      p:maxUploadSize="5242880"//文件最大上传大小
      p:uploadTempDir="file:/home/rookie/temp"/>//临时存储路径

1.2 编写Controller方法

 @RequestMapping("/upload")
    public @ResponseBody String upload(@RequestParam("file") MultipartFile file) throws IOException{
        if(!file.isEmpty()){
            file.transferTo(new File(this.getClass().getClassLoader().getResource("/").getPath()+file.getOriginalFilename()));//将文件从默认目录拷贝
            return "success";
        }else{
            return "redirect:/welcome.jsp";
        }
    }

1.3 HTML页面编写

<form action="upload" enctype="multipart/form-data" method="post">//enctype和method必须
    <input type="file" name="file"/><br/>
    <input type="submit" value="upload"/><br/>
</form>

2. 文件下载

将文件发送资源发送到浏览器,需要完成以下几步:
对请求处理方法使用void返回类型,并在方法中添加HttpServletResponse参数。
将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的body中定义数据类型,并包含媒体类型和子类型标识符。如果不清楚内容类型,并且希望浏览器始终显示另存为对话框,则将他设为application/ectet-stream。
添加一个名为Content-Dispostion的Http响应标题,并赋值attachment;filename=fileName.
(1). 隐藏资源:可以将文件放在WEB-INF目录下,这样只有授权的用户才可以访问
(2).防止交叉引用:获取请求的referer属性,如果该属性值为空或者非预期值,则不将文件返回给浏览器。

Controller编写

@RequestMapping("/download")
public void download(@RequestHeader(value = "referer",defaultValue = "")String referer, HttpServletResponse response) throws IOException{
    if("".equals(referer)) {//判断是否为盗链,浏览器直接输入地址无法下载
        response.getWriter().write("Invalid Request");
        return;
    }
    response.setContentType("application/javascript");
    response.setCharacterEncoding("utf-8");
    System.out.println(referer);
    response.setHeader("Content-Disposition","attachment;filename=jquery.js");
    FileInputStream inputStream=new FileInputStream(this.getClass().getClassLoader().getResource("../../js/jquery-3.2.1.min.js").getPath());//文件为web根目录/js/jquery-3.2.1.min.js
    OutputStream outputStream=response.getOutputStream();
    byte []bytes=new byte[1024];
    while(inputStream.read(bytes)!=-1){
        outputStream.write(bytes);
    }
    outputStream.flush();
    outputStream.close();
    inputStream.close();
}

总结:使用文件上传的步骤:配置依赖项(commons-fileupload),配置MultipartResolver,在Html页面的表单中注意添加method和enctype属性。文件下载步骤:设置文件头(Content-Disposition)、MIME类型和编码方式,将输入流写到HttpServletResponse的输出流中,最后注意刷新输出流,关闭流。

猜你喜欢

转载自blog.csdn.net/liouyi250/article/details/79085258