代碼有些不整潔,但是親測可用
public void download (@RequestParam("filePath") final String filePath,
@RequestParam("originalFileName") String originalFileName,
final HttpServletResponse response, final HttpServletRequest request) {
logger.info("FTPController download begin. ftpPath=" + filePath + " ; originalFileName=" + originalFileName);
boolean downloaded = false;
final boolean exist = ftpAndSftpUtils.isFileExist(filePath);
if (!exist) {
throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCEPTION.setExceptionMsg("文件不存在"));
}
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
response.reset();
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("Chrome") || userAgent.contains("Safari") || userAgent.contains("Firefox") ) {
logger.info("Google、Firefox 瀏覽器");
byte[] bytes = originalFileName.getBytes("UTF-8");
originalFileName = new String(bytes, "ISO-8859-1");
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", originalFileName)); // 文件名外的雙引號處理firefox的空格截斷問題
} else {
logger.info("IE 瀏覽器");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream");
String fileName = URLEncoder.encode(originalFileName, "UTF-8");
response.setHeader("Content-disposition", "attachment; filename=" + fileName); // 文件名外的雙引號處理firefox的空格截斷問題
}
downloaded = ftpAndSftpUtils.downloadFile(filePath, outputStream);
outputStream.flush();
} catch (UnsupportedEncodingException e) {
logger.error("不支持的編碼格式", e);
} catch (IOException e) {
logger.error("文件下載失敗", e);
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
logger.error("輸出流關閉失敗", e);
}
}
}
if (!downloaded) {
throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCEPTION.setExceptionMsg("文件下載失敗"));
}
logger.info("FTPController download end");
}