Java上傳下載完全解析(一)
在Java Web開發中,經常會用到上傳與下載檔案,典型的案例即為伺服器獲取上傳的檔案,將其儲存至本地,並獲取其下載的檔案url,客戶端在獲取下載的url後,在伺服器進行下載。下面我們就來說一下Java中檔案的上傳。
一、設定CommonsMultipartResolver
在Spring中,我們可以使用CommonsMultipartResolver來上傳檔案,所以我們需要宣告一個CommonsMultipartResolver的bean物件,也可以明確的告訴Spring上傳檔案的大小限制:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
其中的maxUploadSize即為最大上傳的大小,單位為B,所以10485760為10M
二、CommonsMultipartResolver的使用:
1、得到CommonsMultipartResolver物件:
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //其中request即為我們請求的HttpServletRequest物件
2、判斷請求是否為MultiPart File檔案上傳請求:
boolean isFileUpload = multipartResolver.isMultipart(request);
三、MultipartHttpServletRequest的使用
在確定了是多檔案上傳的請求後,即可以將HttpServletRequest轉成MultipartHttpServletRequest物件,MultipartHttpServletRequest物件封裝了檔案上傳的檔案物件,可以通過此物件直接得到檔案物件。
1、得到檔名稱列表的迭代器:
Iterator<String> iter = multiRequest.getFileNames();
2、取得上傳的檔案:
MultipartFile file = multiRequest.getFile(iter.next());
四、上傳的示例程式碼:
@ResponseBody
@RequestMapping("/up")
public FileUploadResponse upload(HttpServletRequest request) throws IllegalStateException, IOException, NoSuchAlgorithmException {
String fileHttpPath = "";
//建立一個通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判斷 request 是否有檔案上傳,即多部分請求
if (multipartResolver.isMultipart(request)) {
//轉換成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//取得request中的所有檔名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
//記錄上傳過程起始時的時間,用來計算上傳時間
int pre = (int) System.currentTimeMillis();
//取得上傳檔案
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
//取得當前上傳檔案的檔名稱
String myFileName = file.getOriginalFilename();
//如果名稱不為空,說明該檔案存在,否則說明該檔案不存在
if (!myFileName.trim().isEmpty()) {
System.out.println(myFileName);
String fileName = getRondomFileName() + getFileType(myFileName);
//定義本地路徑
String path = filePath + fileName;
File localFile = new File(path);
file.transferTo(localFile);
fileHttpPath = fileDownloadPath + fileName;
}
}
//記錄上傳該檔案後的時間
int finaltime = (int) System.currentTimeMillis();
System.out.println(finaltime - pre);
}
}
FileUploadResponse uploadResponse = new FileUploadResponse();
uploadResponse.setFilePath(fileHttpPath);
return uploadResponse;
}
五、
下一篇的地址為Java上傳下載完全解析(二) ,會講Java Web中檔案的下載與檔案位置配置資訊在開發與生產環境中的切換方法。
另外此專案的github地址為FileService,裡面會有上面原始碼中沒有的一些工具類,歡迎大家下載,如果感覺有幫助的話,也可以star一下哦。