基於此篇文章中的一些沒有注釋的相關問題,今天進行SpringMVC的文件下載的更新:
新方法:
1.控制層,新建一個方法,返回值類型為ResponseEntity<byte[]>的方法,並在其函數的后面添加對應的后台需要處理的參數,比如可以傳遞FIleName
/**
* 文件下載
*
* @param id
* @return
*/
@GetMapping("/download/")
public ResponseEntity<byte[]> download(@PathVariable("id") String id) throws IOException {
File file = xxxService.buildXlsFileById(id);
return ResponseUtils.buildResponseEntity(file);
}
2. 編寫service返回File文件對象,從Service層中查詢數據庫操作,並查詢文件真正的路徑位置,然后返回File對象
public File buildXlsById(String id){
//do something to find this file
File file=new File("1.txt");
return file;
}
3. 編寫ResponseUtils中的相關方法
/**
* 構建下載類
* @param file
* @return
* @throws IOException
*/
public static ResponseEntity<byte[]> buildResponseEntity(File file) throws IOException {
byte[] body = null;
//獲取文件
InputStream is = new FileInputStream(file);
body = new byte[is.available()];
is.read(body);
HttpHeaders headers = new HttpHeaders();
//設置文件類型
headers.add("Content-Disposition", "attchement;filename=" + file.getName());
//設置Http狀態碼
HttpStatus statusCode = HttpStatus.OK;
//返回數據
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
return entity;
}
4.編寫相對應得URL即可
老方法
/**
* 文件下載
* @Description:
* @param fileName
* @param request
* @param response
* @return
*/
@RequestMapping("/download")
public String downloadFile(@RequestParam("fileName") String fileName,
HttpServletRequest request, HttpServletResponse response) {
if (fileName != null) {
String realPath = request.getServletContext().getRealPath(
"WEB-INF/File/");
File file = new File(realPath, fileName);
if (file.exists()) {
response.setContentType("application/force-download");// 設置強制下載不打開
response.addHeader("Content-Disposition",
"attachment;fileName=" + fileName);// 設置文件名
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
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 (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
return null;
}
