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为我们省去解析,遍历,删除文件等操作

解析:

posted @ 2020-07-31 17:18  lawrence林  阅读(515)  评论(0编辑  收藏  举报