ToB企服应用市场:ToB评测及商务社交产业平台

标题: SpringMVC-09-文件上传和下载 [打印本页]

作者: 用户云卷云舒    时间: 2024-12-9 07:34
标题: SpringMVC-09-文件上传和下载
1、预备工作

Spring

文件上传是项目开发中最常见的功能之一 ,
Spring 可以很好的支持文件上传,但是 Spring 的默认情况中没有装配 MultipartResolver,
因此默认情况下其不能处置惩罚文件上传工作。
假如想利用 Spring 的文件上传功能,则需要在 Spring 情况中配置 MultipartResolver
前端表单

为了能上传文件,
必须将表单的 method 属性设置为 POST,
enctype 属性 设置为 multipart/form-data
只有在如许的情况下,浏览器才会把用户选择的文件以二进制流的形式发送给服务器。
这里不对 enctype 属性作过多的解说,具体的可以去看 HTML  enctype 属性 这篇文章。
文件上传依赖

在2003年,Apache Software Foundation发布了开源的 Commons FileUpload 组件,
其很快成为Servlet/JSP步伐员上传文件的最佳选择。
SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。

2、文件上传

导入文件上传的jar包,commons-fileupload , Maven会自动帮我们导入他的依赖包 commons-io包;
  1. <dependency>
  2.     <groupId>commons-fileupload</groupId>
  3.     <artifactId>commons-fileupload</artifactId>
  4.     <version>1.3.3</version>
  5. </dependency>
复制代码
配置bean:multipartResolver
  1. <bean id="multipartResolver" >
  2.    
  3.     <property name="defaultEncoding" value="utf-8"/>
  4.    
  5.     <property name="maxUploadSize" value="10485760"/>
  6.     <property name="maxInMemorySize" value="40960"/>
  7. </bean>
复制代码
注意!!!这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误!
CommonsMultipartFile 的 常用方法:
测试

前端页面
  1. <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
  2.     <p>
  3.         <input type="file" name="file"/>
  4.     </p>
  5.     <p>
  6.         <input type="submit" value="upload">
  7.     </p>
  8. </form>
复制代码
Controller
  1. @Controller
  2. public class FileController {
  3.     @Autowired
  4.     ServletContext servletContext;
  5.     //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
  6.     //批量上传CommonsMultipartFile则为数组即可
  7.     @RequestMapping("/upload")
  8.     public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
  9.         //获取文件名
  10.         String uploadFileName = file.getOriginalFilename();
  11.         //如果文件名为空,直接回到首页!
  12.         if ("".equals(uploadFileName)) {
  13.             return "redirect:/";
  14.         }
  15.         System.out.println("上传文件名 : " + uploadFileName);
  16.         //获取真实物理路径
  17.         String path = servletContext.getRealPath("/upload");
  18.         //如果路径不存在,创建一个
  19.         File realPath = new File(path);
  20.         if (!realPath.exists()) {
  21.             realPath.mkdir();
  22.         }
  23.         System.out.println("上传文件保存地址:" + realPath);
  24.         InputStream is = file.getInputStream(); //文件输入流
  25.         OutputStream os = new FileOutputStream(new File(realPath, uploadFileName)); //文件输出流
  26.         //读取写出
  27.         int len = 0;
  28.         byte[] buffer = new byte[1024];
  29.         while ((len = is.read(buffer)) != -1) {
  30.             os.write(buffer, 0, len);
  31.         }
  32.         os.close();
  33.         is.close();
  34.         return "redirect:/";
  35.     }
  36.     /**
  37.      * 采用file.transferTo 来保存上传的文件
  38.      */
  39.     @RequestMapping("/upload2")
  40.     public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
  41.         //获取真实物理路径
  42.         String path = servletContext.getRealPath("/upload");
  43.         File realPath = new File(path);
  44.         if (!realPath.exists()) {
  45.             realPath.mkdir();
  46.         }
  47.         //上传文件地址
  48.         System.out.println("上传文件保存地址:" + realPath);
  49.         //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
  50.         file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));
  51.         return "redirect:/";
  52.     }
  53. }
复制代码
注意!!!CommonsMultipartFile 为特殊参数,必须利用 @RequestParam 注解 指定前端参数,否则不能进行数据绑定。

3、文件下载

文件下载步调:
代码实现

前端页面
  1. <p>
  2.     <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/download">点击下载</a>
  3. </p>
复制代码
Controller
  1. @RequestMapping("/download")
  2. public void downloads(HttpServletResponse response) throws Exception {
  3.     //要下载的资源地址
  4.     String path = servletContext.getRealPath("/upload");
  5.     String fileName = "计算机结构框图.jpg";
  6.     //1、设置response 响应头
  7.     response.reset(); //设置页面不缓存,清空buffer
  8.     response.setCharacterEncoding("UTF-8"); //字符编码
  9.     response.setContentType("multipart/form-data"); //多扩展类型表单数据
  10.     //设置响应头为 附件
  11.     response.setHeader("Content-Disposition",
  12.             "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
  13.     File file = new File(path, fileName);
  14.     //2、 读取文件--输入流
  15.     InputStream input = new FileInputStream(file);
  16.     //3、 写出文件--输出流
  17.     OutputStream out = response.getOutputStream();
  18.     byte[] buff = new byte[1024];
  19.     int index = 0;
  20.     //4、执行 写出操作
  21.     while ((index = input.read(buff)) != -1) {
  22.         out.write(buff, 0, index);
  23.     }
  24.     out.close();
  25.     input.close();
  26. }
复制代码
以上文件上传和下载都已完成,各人可以和JavaWeb原生的方式对比一下,就可以知道这个便捷多了!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4