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服务器上时,文件上传的目录在Tomcat\apache-tomcat-8.5.43\webapps\项目名目录下

/**
     * 传统方式文件上传
     * @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";
    }
    
posted @ 2020-04-14 16:55  codeDD  阅读(89)  评论(0编辑  收藏  举报