SpringMVC实现文件上传

  • 1. SpringMVC 传统方式的文件上传
  • 1.1 第一步:导入依赖坐标
  • 1.2 第二步:编写 jsp 页面
  • 1.3 第三步:编写控制器
  • 1.4 第四步:配置文件解析器
  • 2. SpringMVC跨服务器方式文件上传
  • 2.1. 搭建图片服务器 (省略)
  • 2.2 实现SpringMVC跨服务器方式文件上传
  • 2.2.1. 导入开发需要的jar包坐标:
  • 2.2.2 编写文件上传的JSP页面
  • 2.2.3 编写控制器
  • 在模拟SpringMVC跨服务器方式文件上传时遇到的异常与解决


1. SpringMVC 传统方式的文件上传

1.1 第一步:导入依赖坐标

使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包:Commons-fileupload
commons-io
commons-io 不属于文件上传组件的开发 jar 文件,但 Commons-fileupload 组件从 1.1 版本开始,它
工作时需要 commons-io 包的支持

<!-- 文件上传 -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

1.2 第二步:编写 jsp 页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>SpringMVC文件上传方式</h1>

    <form action="file/testFileUpLoad2" method="post" enctype="multipart/form-data" >
        上传文件:<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
    
</body>
</html>

1.3 第三步:编写控制器

@Controller
@RequestMapping("/file")
public class FileUpLoadController {

    /**
     * SpringMVC中的文件上传
     * @param request
     * @param upload
     * @return
     * @throws IOException
     */
    @RequestMapping("testFileUpLoad2")
    public String testFileUpLoad2(HttpServletRequest request, MultipartFile upload) throws IOException {
        System.out.println("SpringMVC上传文件方式...");

        //获取上传文件位置
        String realPath = request.getSession().getServletContext().getRealPath("upload");
        File file  = new File(realPath);
        //判断路径是否存在
        if (!file.exists()){
            //创建该文件夹
            file.mkdir();
        }

        //获取上传文件的名称
        String filename = upload.getOriginalFilename();
        //把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid +"_" + filename;
        //完成文件上传
        upload.transferTo(new File(realPath,filename));
        return "success";
    }
}

1.4 第四步:配置文件解析器

<!-- 配置文件解析器对象  id 的值是固定的 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

**注意:**文件上传的解析器 id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他 字段也将无法绑定)

2. SpringMVC跨服务器方式文件上传

2.1. 搭建图片服务器 (省略)

  1. 根据文档配置tomcat9的服务器,现在是2个服务器
  2. 导入资料中day02_springmvc5_02image项目,作为图片服务器使用

2.2 实现SpringMVC跨服务器方式文件上传

2.2.1. 导入开发需要的jar包坐标:

<dependencies>
    <!-- 跨服务器上传文件jar包 -->
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>
  </dependencies>

2.2.2 编写文件上传的JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>跨服务器文件上传方式</h1>

    <form action="file/testFileUpLoad3" method="post" enctype="multipart/form-data" >
        上传文件:<input type="file" name="upload"><br>
        <input type="submit" value="上传">
    </form>
</body>
</html>

2.2.3 编写控制器

/**
     * 跨服务器上传
     * @return
     */
    @RequestMapping("/testFileUpLoad3")
    public String testFileUpLoad(MultipartFile upload) throws IOException {
        System.out.println("跨服务上传方法执行了");
        //定义跨服务器路径
        String path = "http://localhost:9090/fileUpLoadService/uploads/";

        //获取文件名
        String filename = upload.getOriginalFilename();
        //把文件设置成唯一值 uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid + "_" + filename;

        //创建客户端
        Client client = Client.create();

        //上传数据
        WebResource webResource = client.resource(path + filename);

        webResource.put(upload.getBytes());

        return "success";

    }

在模拟SpringMVC跨服务器方式文件上传时遇到的异常与解决

异常解决参考: