天天看點

upload4j安全、高效、易用的java http檔案上傳架構

簡介

     upload4j是一款輕量級http檔案上傳架構,使用簡單,實作高效,功能專一,擺脫傳統http檔案上傳架構的繁瑣。 

     upload4j的誕生并不是為了解決所有上傳需求,而是專注于基礎通用需求。  

upload4j帶來的

     ·  實作直接檔案流上傳、html表單流上傳兩種上傳模式。

     ·  io操作部分采用nio機制。

     ·  支援檔案過濾,并且基于二進制檔案頭進行過濾,而非傳統的檔案擴充名過濾。

     ·  上傳檔案大小不受記憶體大小限制。

upload4j給不了的

     ·  檔案上傳進度。

     ·  批量上傳。

upload4j使用示例

直接檔案流上傳

啟用過濾功能

1 // 過濾器
 2 MetaFilter metaFilter = new MetaFilter();
 3 metaFilter.add(".jpg", "FFD8FF");  // 允許的檔案類型,params: 檔案字尾名, 檔案頭十六進制字元串
 4 Map<String, String> metaMap = new HashMap<String, String>();
 5 metaMap.put(".png", "89504E47");
 6 metaFilter.fromMap(metaMap);  // 批量添加允許的檔案類型
 7 
 8 // 配置
 9 MetaFilterConfig metaFilterConfig = MetaFilterConfig.custom().setBufferSize(8192)  // 預設8192B,機關B
10                                                  .setMaxFileSize(1024 * 1024)  // 限制檔案最大1M,機關B
11                                                  .setFilter(metaFilter)  // 過濾器
12                                                  .setRequest(request)  // 從request對象的body中讀取檔案流
13                                                  .setFileNameWithoutSuffix("123")  // 儲存檔案名(不帶擴充名,自動識别)
14                                                  .setSavePath("/home/user1/upload/img/2015/09/24/");  // 儲存路徑
15 
16 // 上傳
17 StreamUpload streamUpload = new StreamUpload();
18 SimpleUploadResponse response = streamUpload.upload(metaFilterConfig);
19 
20 // 上傳結果
21 if(response.isSuccess()){  // 成功
22     // 擷取檔案儲存完整路徑
23     response.getFilePath();
24     // ......
25 }else{  // 失敗
26     // 判斷失敗是否可控
27     if(response.getException() == null){  // 可控
28         // 擷取失敗原因
29         response.getErrmsg();
30         // ......
31     }else{  // 不可控
32         // 直接抛出異常
33         throw response.getException();
34     }
35 }      

不啟用過濾功能

1 // 配置
 2 StreamConfig streamConfig = StreamConfig.custom().setBufferSize(8192)  // 預設8192B,機關B
 3                                                  .setMaxFileSize(1024 * 1024)  // 限制檔案最大1M,機關B
 4                                                  .setRequest(request)  // 從request對象的body中讀取檔案流
 5                                                  .setFileNameWithSuffix("123.jpg")  // 儲存完整檔案名(帶擴充名)
 6                                                  .setSavePath("/home/user1/upload/img/2015/09/24/");  // 儲存路徑
 7 
 8 // 上傳
 9 StreamUpload streamUpload = new StreamUpload();
10 SimpleUploadResponse response = streamUpload.upload(streamConfig);
11 
12 // 上傳結果
13 if(response.isSuccess()){  // 成功
14     // 擷取檔案儲存完整路徑
15     response.getFilePath();
16     // ......
17 }else{  // 失敗
18     // 判斷失敗是否可控
19     if(response.getException() == null){  // 可控
20         // 擷取失敗原因
21         response.getErrmsg();
22         // ......
23     }else{  // 不可控
24         // 直接抛出異常
25         throw response.getException();
26     }
27 }      

html表單流上傳

1 // 過濾器
 2 MetaFilter metaFilter = new MetaFilter();
 3 metaFilter.add(".jpg", "FFD8FF");  // 允許的檔案類型,params: 檔案字尾名, 檔案頭十六進制字元串
 4 Map<String, String> metaMap = new HashMap<String, String>();
 5 metaMap.put(".png", "89504E47");
 6 metaFilter.fromMap(metaMap);  // 批量添加允許的檔案類型
 7 
 8 // 配置
 9 MetaFilterConfig metaFilterConfig = MetaFilterConfig.custom().setBufferSize(8192)  // 預設8192B,機關B
10                                                  .setMaxFileSize(1024 * 1024)  // 限制檔案最大1M,機關B
11                                                  .setFilter(metaFilter)  // 過濾器
12                                                  .setRequest(request)  // 從request對象的body中讀取檔案流
13                                                  .setFileNameWithoutSuffix("123")  // 儲存檔案名(不帶擴充名,自動識别)
14                                                  .setSavePath("/home/user1/upload/img/2015/09/24/");  // 儲存路徑
15 
16 // 上傳
17 FormUpload formUpload = new FormUpload();
18 SimpleUploadResponse response = formUpload.upload(metaFilterConfig);
19 
20 // 上傳結果
21 if(response.isSuccess()){  // 成功
22     // 擷取檔案儲存完整路徑
23     response.getFilePath();
24     // ......
25 }else{  // 失敗
26     // 判斷失敗是否可控
27     if(response.getException() == null){  // 可控
28         // 擷取失敗原因
29         response.getErrmsg();
30         // ......
31     }else{  // 不可控
32         // 直接抛出異常
33         throw response.getException();
34     }
35 }      
1 // 配置
 2 FormConfig formConfig = FormConfig.custom().setBufferSize(8192)  // 預設8192B,機關B
 3                                                  .setMaxFileSize(1024 * 1024)  // 限制檔案最大1M,機關B
 4                                                  .setRequest(request)  // 從request對象的body中讀取檔案流
 5                                                  .setFileNameWithoutSuffix("123")  // 儲存檔案名(不帶擴充名,自動提取)
 6                                                  .setSavePath("/home/user1/upload/img/2015/09/24/");  // 儲存路徑
 7 
 8 // 上傳
 9 FormUpload formUpload = new FormUpload();
10 SimpleUploadResponse response = formUpload.upload(formConfig);
11 
12 // 上傳結果
13 if(response.isSuccess()){  // 成功
14     // 擷取檔案儲存完整路徑
15     response.getFilePath();
16     // ......
17 }else{  // 失敗
18     // 判斷失敗是否可控
19     if(response.getException() == null){  // 可控
20         // 擷取失敗原因
21         response.getErrmsg();
22         // ......
23     }else{  // 不可控
24         // 直接抛出異常
25         throw response.getException();
26     }
27 }      

浏覽upload4j項目