今天在一個群里扯了半天的給一個初入職場的新手解釋文件下載的問題,在此來總結下。
文件下載有兩種方式:
靜態文件下載
靜態文件直接下載,設置下響應頭即可。
//請求路徑dowload
@RequestMapping("dowload")
public void download(HttpServletResponse rep,String filename){
//設置響應頭的Content-Disposition屬性為attachment(附件)
rep.setHeader("Content-Disposition","attachment;filename="+filename);
}
動態文件下載
需要在下載的業務代碼裡面動態生成文件對象,然後將文件對象輸出到網路輸出流中。
比如創建一個xls文件並下載,使用的是easyexcel:
先封裝一個私有的方法,將list數據封裝在ExcelWriter對象中,寫出到網路輸出流中。
private void createXls(List<Contract> list, ServletOutputStream os) throws IOException{
ExcelWriter writer = new ExcelWriter(os, ExcelTypeEnum.XLSX);
Sheet sheet1 = new Sheet(1, 0);
sheet1.setSheetName("合同列表");
List<List<String>> data = new ArrayList<>();
list.forEach(l -> {
List<String> item = new ArrayList<>();
Optional<String> contractName= Optional.ofNullable(l.getContractName());
item.add(contractName.orElse(""));
data.add(item);
});
List<List<String>> head = new ArrayList<List<String>>();
List<String> headCoulumn1 = new ArrayList<String>();
headCoulumn1.add("合同名稱");
head.add(headCoulumn1);
Table table = new Table(1);
table.setHead(head);
writer.write0(data, sheet1, table);
writer.finish();
}
調用方法
public void getxls(String name, String from, String to, HttpServletResponse response){
if ( "".equals(from)) {
from = "2020-01-01";
}
if ( "".equals(to)) {
to = LocalDate.now().toString();
}
List<Contract> list = contractMapper.selectContractList(Wrappers.<Contract>lambdaQuery().like(Contract::getContractName, name)
.between(Contract::getCreateDate, LocalDate.parse(from), LocalDate.parse(to)).orderByDesc(Contract::getCreateDate));
String xlsName = from + "至" +to + "-合同列表";
try {
response.reset(); // 重點突出
response.setCharacterEncoding("UTF-8"); // 重點突出
response.setContentType("application/x-msdownload"); // 不同類型的文件對應不同的MIME類型 // 重點突出
// 對文件名進行編碼處理中文問題
xlsName = new String((xlsName + ".xlsx").getBytes("GB2312"), "ISO-8859-1");
// inline在瀏覽器中直接顯示,不提示用戶下載,默認
// attachment彈出對話框,提示用戶進行下載保存本地
response.setHeader("Content-Disposition", "attachment;filename=" + xlsName);
// 通過response流輸出,直接輸出到客戶端瀏覽器中。
ServletOutputStream os = response.getOutputStream();
createXls(list,os);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
另外:
靜態文件下載需要服務端保存有下載名稱的的磁碟文件,必須是真實存在的,文件的生成、刪除需要手動處理。
而動態文件下載我們直接將文件對象流寫入到網路輸出流中,不必保存文件對象到磁碟中,它存在於內存中,會自動被回收處理。
文件的下載不論是動態還是靜態都需要傳入服務端一定的參數,參數獲取我們通常採用get方式傳參(URL傳參)。
群里扯了半天的需要是這樣的:管理員端生成一個特定條件的xls文件供多用戶下載。
1.管理員端生成文件的操作是這樣的,選擇生成條件,post傳遞給服務端生成xls文件,在保存前先查詢當前是否有此文件存在,如果有則刪除後再保存。
2.用戶端點擊的是一個xxx.xx/getxls?filename=xxx的鏈接,獲取的就是服務端保存的那個最新的文件。
每當管理員端重新設置條件生成xls文件後,用戶端獲取的都是最新的xls文件,因此這個文件名需要固定寫死。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/218456.html