SpringMVC-文件上传

深藏阁楼爱情的钟 2023-08-17 16:24 14阅读 0赞

SpringMVC-文件上传

1.文件上传

  1.1 文件上传必须

  a. form表单的enctype取值必须是:multipart/form-data(默认值是:application/x-www-form-urlencoded)

  b. method属性取值必须是post

  c. 提供一个文件选择域。

  1.2 文件上传的原理分析

  当form表单的enctype取值不是默认值后,request.getParameter()将失效

  enctype=”aaplication/x-www-form-urlencoded”时,form表单的正文内容是:

    key=value&key=value&key=value

  enctype=”multipart/form-data”时,请求正文的内容就变成:

    每一部分都是MIME类型的描述正文

    ——————————————-7de1a433602ac 分界符

    Content-Disposition: form-data; name=”userName” 协议头

    …

  1.3 依赖jar包

1685989-20190822102841184-31664973.png

2. 传统方式实现文件上传

  传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。

  2.1 pom.xml文件依赖

  1. <!--文件上传依赖的两个jar包-->
  2. <dependency>
  3. <groupId>commons-fileupload</groupId>
  4. <artifactId>commons-fileupload</artifactId>
  5. <version>1.3.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>commons-io</groupId>
  9. <artifactId>commons-io</artifactId>
  10. <version>2.4</version>
  11. </dependency>

  2.2 jsp页面

  1. <form action="/user/fileupload01" method="post" enctype="multipart/form-data">
  2. 选择文件:<input type="file" name="upload"><br>
  3. <input type="submit" value="上传">
  4. </form>

  2.3 编写控制器

  

  1. @Controller
  2. @RequestMapping("/user")
  3. public class FileUploadController {
  4. /**
  5. * 使用原始方式上传文件
  6. * @return
  7. */
  8. @RequestMapping("/fileupload01")
  9. public String testFileUpload(HttpServletRequest request) throws Exception {
  10. //使用fileupload组件完成上传文件
  11. //上传的位置
  12. String realPath = request.getSession().getServletContext().getRealPath("/uploads");
  13. System.out.println(realPath);
  14. //判断该路径是否存在
  15. File file = new File(realPath);
  16. if (!file.exists()){
  17. //创建该文件夹
  18. file.mkdirs();
  19. }
  20. //解析request对象,获取上传文件项
  21. DiskFileItemFactory factory = new DiskFileItemFactory();
  22. ServletFileUpload upload= new ServletFileUpload(factory);
  23. //解析request
  24. List<FileItem> items = upload.parseRequest(request);
  25. for (FileItem item: items) {
  26. //进行判断,当前item是否是上传文件项
  27. if (item.isFormField()){
  28. //普通表单项
  29. }else {
  30. String uuid = UUID.randomUUID().toString().replace("-", "");
  31. //文件上传项
  32. String fileName = uuid + "_" +item.getName();
  33. //完成上传
  34. item.write(new File(file, fileName));
  35. //删除临时文件
  36. item.delete();
  37. }
  38. }
  39. System.out.println("文件上传成功");
  40. return "success";
  41. }
  42. }

  2.4 配置文件解析器

  1. <!--文件上传
  2. id必须为="multipartResolver"
  3. -->
  4. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  5. <!--上传文件的大小,这里设置的是10M-->
  6. <property name="maxUploadSize" value="10485760"></property>
  7. </bean>

3. 使用SpringMVC方式上传文件

  3.1 将控制器修改为

  1. /**
  2. * 使用SpringMVC方式上传文件
  3. * MultipartFile upload: 名称应和input的name值一致
  4. * @return
  5. */
  6. @RequestMapping("/fileupload02")
  7. public String testFileUpload2(HttpServletRequest request, /*@RequestParam(name = "upload") */MultipartFile upload) throws Exception {
  8. //使用fileupload组件完成上传文件
  9. //上传的位置
  10. String realPath = request.getSession().getServletContext().getRealPath("/uploads");
  11. System.out.println(realPath);
  12. //判断该路径是否存在
  13. File file = new File(realPath);
  14. if (!file.exists()){
  15. //创建该文件夹
  16. file.mkdirs();
  17. }
  18. String uuid = UUID.randomUUID().toString().replace("-", "");
  19. //文件上传项
  20. String fileName = uuid + "_" + upload.getOriginalFilename();
  21. //完成上传
  22. upload.transferTo(new File(realPath, fileName));
  23. System.out.println("SpringMVC文件上传成功");
  24. return "success";
  25. }

4.SpringMVC跨服务器实现文件上传

  4.1 分服务器的目的

  分服务器的目的是让服务器各司其职,从而提高项目的运行的效率

  4.2 准备两个tomcat服务器,并创建一个用于存放图片的web工程

  4.3 pom文件除了依赖文件上传的两个jar,还需要jersey

  1. <!--跨服务器文件上传-->
  2. <dependency>
  3. <groupId>com.sun.jersey</groupId>
  4. <artifactId>jersey-core</artifactId>
  5. <version>1.18.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.sun.jersey</groupId>
  9. <artifactId>jersey-client</artifactId>
  10. <version>1.18.1</version>
  11. </dependency>

  4.4 将控制器修改为

  

  1. /**
  2. * 跨服务器上传文件
  3. * MultipartFile upload: 名称应和input的name值一致
  4. * @return
  5. */
  6. @RequestMapping("/fileupload03")
  7. public String testFileUpload3(HttpServletRequest request, MultipartFile upload) throws Exception {
  8. System.out.println("跨服务器文件上传");
  9. //使用fileupload组件完成上传文件
  10. //定义上传服务器路径
  11. String path = "http://localhost:9090/uploads/";
  12. //判断该路径是否存在
  13. File file = new File(path);
  14. if (!file.exists()){
  15. //创建该文件夹
  16. file.mkdirs();
  17. }
  18. String uuid = UUID.randomUUID().toString().replace("-", "");
  19. //文件上传项
  20. String fileName = uuid + "_" + upload.getOriginalFilename();
  21. //创建客户端的对象
  22. Client client = Client.create();
  23. //和图片服务器进行连接
  24. WebResource webResource = client.resource(path + fileName);
  25. //完成上传
  26. webResource.put(upload.getBytes());
  27. System.out.println("SpringMVC文件上传成功");
  28. return "success";
  29. }

源码:github

SpringMVC异常处理

转载于:https://www.cnblogs.com/liulebin/p/11393162.html

发表评论

表情:
评论列表 (有 0 条评论,14人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC文件

    文件上传自然是一个网站必不可少的元素之一,SpringMVC这个网站编程框架自然也有这个东西,下一面举一个例子说明这个问题。 如下图所示,一个简单的上传控件,只让上传bmp、

    相关 SpringMVC_文件

    一、文件上传 1、说明 SpringMVC为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。Spring用 Jak