這一節的目的是實作檔案的打包下載下傳。
有了Hutool,感覺輕松多了呢!
我們還是要導入Hutool,幫我們省去檔案操作的麻煩。
修改頁面
<ul>
<li th:each="file:${files}">
[[${file.getName()}]]
<a th:href="@{'download?file='+${file.getName()}}" target="_blank" rel="external nofollow" >
打包下載下傳
</a>
</li>
</ul>
和之前不同,這邊不用th:text了,然後在每個檔案旁邊加一個打包下載下傳的超連結。
在IndexController中添加一個新的方法
@RequestMapping("/download")
@ResponseBody
public void index(String file){
String targetName = diskpath + File.separator + file;
//打包到目前目錄
ZipUtil.zip(targetName);
}
ZipUtil是Hutool提供的,我們直接拿來用即可。
重新寫download方法,增加下載下傳功能
@RequestMapping("/download")
@ResponseBody
public void download(String file, HttpServletResponse response) throws UnsupportedEncodingException, FileNotFoundException {
String targetName = diskpath + File.separator + file;
//打包到目前目錄
ZipUtil.zip(targetName);
targetName = targetName+".zip";
response.setContentType("application/force-download");
//解決下載下傳檔案名中文不顯示的問題
String fileName = new String(file.getBytes("utf-8"),"ISO8859-1");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");
//輸出流,下載下傳檔案
byte[] buffer = new byte[1024];
try {
FileInputStream fis = new FileInputStream(targetName);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
如何下載下傳完畢後就删掉zip檔案
很簡單,在下載下傳完畢後,立刻調用删除的方法即可。注意,删檔案之前,一定要關閉流!
核心代碼如下:
//輸出流,下載下傳檔案
byte[] buffer = new byte[1024];
try {
FileInputStream fis = new FileInputStream(targetName);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
//關閉流
fis.close();
os.close();
boolean del = FileUtil.del(targetName);
System.out.println(del);
} catch (IOException e) {
e.printStackTrace();
}
因為本項目非常簡單,如果感興趣地話,個人建議大家自己動手練一練。(畢竟也沒多少行代碼)
是以,這邊就不提供完整項目了。
比如我點選第二個打包下載下傳。
就真的下載下傳下來了。
而且,壓縮包是自動删掉的。