SpringMVC-文件上传

SpringMVC-文件上传

1.文件上传

  1.1 文件上传必须

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

  b. method属性取值必须是post

  c. 提供一个文件选择域。<input type="file"/>

  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包

 

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

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

  2.1 pom.xml文件依赖

    <!--文件上传依赖的两个jar包-->
    <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>

   2.2 jsp页面

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

  2.3 编写控制器

  

@Controller
@RequestMapping("/user")
public class FileUploadController {

    /**
     * 使用原始方式上传文件
     * @return
     */
    @RequestMapping("/fileupload01")
    public String testFileUpload(HttpServletRequest request) throws Exception {

        //使用fileupload组件完成上传文件
        //上传的位置
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        System.out.println(realPath);
        //判断该路径是否存在
        File file = new File(realPath);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }
        //解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload= new ServletFileUpload(factory);
        //解析request
        List<FileItem> items = upload.parseRequest(request);
        for (FileItem item: items) {
            //进行判断,当前item是否是上传文件项
            if (item.isFormField()){
                //普通表单项
            }else {
                String uuid = UUID.randomUUID().toString().replace("-", "");
                //文件上传项
                String fileName = uuid + "_" +item.getName();
                //完成上传
                item.write(new File(file, fileName));
                //删除临时文件
                item.delete();
            }

        }
        System.out.println("文件上传成功");
        return "success";
    }
}

  2.4 配置文件解析器

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

 

3. 使用SpringMVC方式上传文件

  3.1 将控制器修改为

 /**
     * 使用SpringMVC方式上传文件
     *     MultipartFile upload: 名称应和input的name值一致
     * @return
     */
    @RequestMapping("/fileupload02")
    public String testFileUpload2(HttpServletRequest request, /*@RequestParam(name = "upload") */MultipartFile upload) throws Exception {

        //使用fileupload组件完成上传文件
        //上传的位置
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        System.out.println(realPath);
        //判断该路径是否存在
        File file = new File(realPath);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }

        String uuid = UUID.randomUUID().toString().replace("-", "");
        //文件上传项
        String fileName = uuid + "_" + upload.getOriginalFilename();
        //完成上传
        upload.transferTo(new File(realPath, fileName));

        System.out.println("SpringMVC文件上传成功");
        return "success";
    }

 

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

  4.1 分服务器的目的

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

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

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

    <!--跨服务器文件上传-->
    <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>

  4.4 将控制器修改为

  

/**
     * 跨服务器上传文件
     *     MultipartFile upload: 名称应和input的name值一致
     * @return
     */
    @RequestMapping("/fileupload03")
    public String testFileUpload3(HttpServletRequest request, MultipartFile upload) throws Exception {

        System.out.println("跨服务器文件上传");

        //使用fileupload组件完成上传文件
        //定义上传服务器路径
        String path = "http://localhost:9090/uploads/";

        //判断该路径是否存在
        File file = new File(path);
        if (!file.exists()){
            //创建该文件夹
            file.mkdirs();
        }


        String uuid = UUID.randomUUID().toString().replace("-", "");
        //文件上传项
        String fileName = uuid + "_" + upload.getOriginalFilename();

        //创建客户端的对象
        Client client = Client.create();
        //和图片服务器进行连接
        WebResource webResource = client.resource(path + fileName);
        //完成上传
        webResource.put(upload.getBytes());

        System.out.println("SpringMVC文件上传成功");
        return "success";
    }

 

 


 

源码:github 

SpringMVC异常处理

 

posted @ 2019-08-22 11:10  PopsiCola  阅读(171)  评论(0编辑  收藏  举报