zoukankan      html  css  js  c++  java
  • SpringMVC学习03:文件上传

    SpringMVC学习03:文件上传

    文件上传的前提

    1. <form>表单的enctype属性取值必须是multipart/form-data,表示表单内容是分块的

    2. <form>表单的method属性取值必须是post,因为get有长度限制

    3. 提供一个<input>标签,type属性取值是file,用来上传文件

    4. 导入文件上传的相关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>
      

    传统方式文件上传

    部署在Tomcat服务器上时,文件上传的目录在Tomcatapache-tomcat-8.5.43webapps项目名目录下

    /**
         * 传统方式文件上传
         * @param request
         * @return
         * @throws Exception
         */
        @RequestMapping(path = "/fileUpload1")
        public String fileUpload1(HttpServletRequest request) throws Exception {
            System.out.println("传统方式文件上传");
            //先获取要上传的文件目录
            String realPath = request.getSession().getServletContext().getRealPath("/uploads");
            //创建File对象,向该路径下上传文件
            File file = new File(realPath);
            //判断该路径是否存在,如果不存在,创建该路径
            if(!file.exists()){
                file.mkdirs();
            }
            //创建磁盘文件项工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //解析request对象
            List<FileItem> fileItems = upload.parseRequest(request);
            // 遍历
            for (FileItem fileItem : fileItems) {
                //判断文件项是普通表单项还是上传的文件
                if(fileItem.isFormField()){
    
                }else{
                    //获取上传文件的名称
                    String filename = fileItem.getName();
                    //把文件的名称设置唯一值,使用uuid
                    String uuid = UUID.randomUUID().toString().replace("-", "");
                    filename = uuid + filename;
                    //上传文件
                    fileItem.write(new File(file,filename));
                    //删除临时文件
                    fileItem.delete();
                }
            }
            return "success";
    }
    

    SpringMVC文件上传

    1. SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的
      name属性名称相同

      <h1>SpringMVC文件上传</h1>
      <form action="file/fileUpload2" method="post" enctype="multipart/form-data">
          文件上传:<input type="file" name="fileUpload"><br>
          <input type="submit" value="上传文件">
      </form>
      
      /**
           * SpringMVC文件上传
           * @param request
           * @param fileUpload
           * @return
           * @throws Exception
           */
          @RequestMapping(path = "/fileUpload2")
          public String fileUpload2(HttpServletRequest request, MultipartFile fileUpload) throws Exception {
              System.out.println("SpringMVC文件上传");
              //先获取要上传的文件目录
              String realPath = request.getSession().getServletContext().getRealPath("/uploads");
              //创建File对象,向该路径下上传文件
              File file = new File(realPath);
              //判断该路径是否存在,如果不存在,创建该路径
              if(!file.exists()){
                  file.mkdirs();
              }
              //获取上传文件的名称
              String filename = fileUpload.getOriginalFilename();
              //把文件的名称设置唯一值,使用uuid
              String uuid = UUID.randomUUID().toString().replace("-", "");
              filename = uuid + filename;
              //上传文件
              fileUpload.transferTo(new File(file,filename));
              return "success";
      }
      
    2. 配置文件解析器对象,在SpringMVC.xml中添加配置

      <!--配置文件解析器,要求id必须是multipartResolver-->
          <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
              <property name="maxUploadSize" value="10485760"/><!--限制上传的文件大小-->
          </bean>
      

    SpringMVC实现跨服务器文件上传

    1. 搭建图片服务器

    2. 导入跨服务器所需的jar包,在pom.xml中添加依赖的坐标

      <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>
      
    3. 创建文件上传的jsp页面

      <h1>SpringMVC跨服务器文件上传</h1>
      <form action="file/fileUpload3" method="post" enctype="multipart/form-data">
          文件上传:<input type="file" name="fileUpload"><br>
          <input type="submit" value="上传文件">
      </form>
      
    4. 创建控制器

      /**
      * SpringMVC跨服务器方式的文件上传
      * @param request
      * @return
      * @throws Exception
      */
      @RequestMapping(value="/fileupload3")
      public String fileupload3(MultipartFile upload) throws Exception {
      	System.out.println("SpringMVC跨服务器方式的文件上传...");
      	// 定义图片服务器的请求路径
      	String path = "http://localhost:9090/springmvc_fileUpload/uploads/";
      	// 获取到上传文件的名称
      	String filename = upload.getOriginalFilename();
      	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
      	// 把文件的名称唯一化
      	filename = uuid+"_"+filename;
      	// 向图片服务器上传文件
      	// 创建客户端对象
      	Client client = Client.create();
      	// 连接图片服务器
      	WebResource webResource = client.resource(path+filename);
      	// 上传文件
      	webResource.put(upload.getBytes());
      	return "success";
      }
      
  • 相关阅读:
    ASP.NET Core MVC Razor小记
    ASP.NET Core引入第三方日志框架及简单实现日志策略配置
    test
    记录一个Windows explorer进程卡死的处理,有关于“MicrosoftWindows.Client.CBS_cw5n1h2txyewy”的,已解决!
    Windows版本sed工具
    相同xml批量创建替换脚本.sh
    springboot1.x apollo 更改属性值不起作用。 ConfigurationProperties
    jmeter固定定时器
    jmeter函数助手参数化
    jmeter循环控制器
  • 原文地址:https://www.cnblogs.com/codeDD/p/12699129.html
Copyright © 2011-2022 走看看