本地下載文件后綴正常,服務器下載文件后綴都為.txt的解決方法:
后綴為 未知文件.txt 的原因為前端無權限獲取Content-Disposition中的文件名
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
//將文件名設置到 Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
// 這一行一定要加 意為允許前端獲取Content-Disposition的文件名
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
下載遠程文件代碼:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
需引入commons-io使用IOUtils
/**
* 流下載
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param filePath 文件路徑
*/
public void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) {
OutputStream os = null; //輸出流
try {
os = response.getOutputStream();
//獲取文件名
String fileName = downloadFileDTO.getFilePath().substring(filePath.lastIndexOf("/")+1);
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
//將文件名設置到 Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//允許前端獲取Content-Disposition中的文件名
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
URL url = new URL (filePath);
URLConnection uc = url.openConnection();
IOUtils.copy(uc.getInputStream(), os);
os.flush();
}catch (Exception e){
log.error("下載文件失敗:{}",e.getMessage());
}finally {
try {
if(os !=null){
os.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}