1. 程式人生 > 實用技巧 >8、檔案上傳原理

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為我們省去解析,遍歷,刪除檔案等操作

解析: