• 8、文件上传原理


    JAVA WEB方式上传

    1、添加依赖

    <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、编写HTML表单
    (1)表单的enctype属性必须"multipart/form-data
    (2)发送请求的方式必须是POST
    (3)文件选择域

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

    3、编写Controller

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/fileupload")
        public String fileupload1(HttpServletRequest request) throws Exception {
            System.out.println("文件上传了");
            
            //使用fileupload组件完成文件上传
            //上传的位置:通过最大的域对象获取该文件的绝对路径
            String realPath = request.getSession().getServletContext().getRealPath("/update");
            //判断该路径是否存在
            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 filename = item.getName();
                    //uuid,当上传的图片名是相同时避免覆盖
                    String uuid = UUID.randomUUID().toString().replace("-","");
                    filename = uuid + "_" +  filename;
                    //完成文件上传往realPath传filename的文件
                    item.write(new File(realPath, filename));
                    //删除临时文件,上传文件时会产生临时文件于内存中
                    item.delete();
                }
            }
            System.out.println(realPath);
            return "success";
        }
    }
    

    Spring MVC方式上传

    spring配置文件配置(文件上传必要前提)
    id必须为multipartResolver

    <!--配置文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--文件最大大小10mb-->
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
    

    html
    (1)enctype必须是multipart/form-data
    (2)表单的提交方式必须是Post
    (3)提供一个文件选择域

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

    Controller

    /**
     * springMVC方式文件上传
     * 通过文件域名称与MultipartFile变量名建立对应关系通过反射将文件内容穿个upload对象,省去了
     * 获取请求体内容,解析请求体,遍历请求筛选上传文件项等步骤。
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上传");
    
        //使用fileupload组件完成文件上传
        //上传的位置:通过最大的域对象获取该文件的绝对路径
        String realPath = request.getSession().getServletContext().getRealPath("/update");
        //判断该路径是否存在
        File file = new File(realPath);
        if(!file.exists()){
            //创建文件夹
            file.mkdirs();
        }
    
        //说明上传文件项
        //获取上传文件的名称
        String filename = upload.getOriginalFilename();
        //uuid,当上传的图片名是相同时避免覆盖
        String uuid = UUID.randomUUID().toString().replace("-","");
        filename = uuid + "_" +  filename;
        //完成文件上传往realPath传filename的文件
       upload.transferTo(new File(realPath, filename));
        System.out.println(realPath);
        return "success";
    }
    

    SpringMvc为我们省去解析,遍历,删除文件等操作

    解析:

  • 相关阅读:
    Win7升Windows10有获取通知,但是就不推送的解决方法
    使用git@osc管理现有项目
    暗黑符文之语1.10
    springcloud干活之服务消费者(feign)
    springcloud干货之服务消费者(ribbon)
    springcloud干货之服务注册与发现(Eureka)
    java对redis的基本操作
    微信公众号开发模式中文乱码
    Java 验证代理ip
    maven将项目及第三方jar打成一个jar包
  • 原文地址:https://www.cnblogs.com/Ryuichi/p/13384229.html
Copyright © 2020-2023  润新知