工作中文件下載是一個非常常見的功能,但請求頭設置卻經常容易忘記。這裏寫一個樣例供大家參考。這裏設置文件編碼格式,主要防止下載文件中文名亂碼。
一、文件下載
1、主要設置 下載的類型
2、設置下載文件的名稱
@GetMapping("/downloadFile")
public void downloadFile(HttpServletResponse response,@RequestParam("fileContent") Integer fileContent) {
File file = null;
try {
file = new File(fileContentMap.get(fileContent));
byte[] buff = new byte[1024];
String fileName = new String(file.getName().getBytes(), "ISO8859-1");
response.setHeader("content-type", "application/octet-stream;charset=ISO8859-1");
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"", fileName));
response.setHeader("Content-Length", String.valueOf(file.length()));
ServletOutputStream os = response.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int i=bis.read(buff);
while (i != -1) {
os.write(buff, 0, i);
os.flush();
bis.read(buff);
}
} catch (IOException e) {
logger.error("viewFile fail fileName is {}", Objects.isNull(file) ? "加載文件是失敗" : file.getName(), e);
}
}
二、進制視頻文件mp4,及圖片預覽設置
這裏是設置預覽功能是通過二進制方式,這裏需要注意的是,通過二進制預覽並不是一個特別好的方式。
private static Map<Integer, String> fileContentMap = new HashMap<Integer,String>();
static {
fileContentMap.put(1, "F:\\xxx\\xx.mp4");
fileContentMap.put(2, ""F:\\xxx\\xx..zip");
fileContentMap.put(3, ""F:\\xxx\\xx.docx");
fileContentMap.put(4, ""F:\\xxx\\xx..bmp");
fileContentMap.put(5, ""F:\\xxx\\xx..png");
}
/**
* 文件預覽
*/
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@GetMapping("/viewFile")
public void viewFile(HttpServletResponse response,@RequestParam("fileContent") Integer fileContent) {
File file = null;
try {
file = new File(fileContentMap.get(fileContent));
String fileName = file.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if ("mp4".equals(fileType)) {
response.setHeader("content-type", "video/mp4");
} else if ("jpg,jpeg,gif,png,bmp".contains(fileType)) {
response.setHeader("content-type", "image/" + fileType);
} else {
response.setHeader("Content-disposition", String.format("attachment;filename=\"%s\"", new String(fileName.getBytes(), "ISO8859-1")));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("content-type", "application/octet-stream;charset=ISO8859-1");
response.setContentType("application/octet-stream;charset=ISO8859-1");
}
byte[] buff = new byte[1024];
ServletOutputStream os = response.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int i=bis.read(buff);
while (i != -1) {
os.write(buff, 0, i);
os.flush();
bis.read(buff);
}
} catch (IOException e) {
logger.error("viewFile fail fileName is {}", Objects.isNull(file) ? "加載文件是失敗" : file.getName(), e);
}
}