spring boot - 文件下载
文件下载方式
- 先读取到服务器,然后通过 outputStream 写出到浏览器
- 获取 outputstream ,边读边写
先读取到服务器,然后通过 outputStream 写出到浏览器
@GetMapping("/download")
public ResponseEntity<InputStreamResource> download(HttpServletRequest request,
HttpServletResponse response) throws FileNotFoundException {
String fullPath = "abc.iso";
log.info("request: download");
File downloadFile = new File(fullPath);
FileInputStream inputStream = new FileInputStream(downloadFile);
//FileSystemResource
// FileSystemResource file = new FileSystemResource(fullPath);
// InputStreamResource inputStreamResource
// = new InputStreamResource(file.getInputStream());
InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
HttpHeaders headers = new HttpHeaders();
headers.setContentLength(downloadFile.length());
ServletContext context = request.getServletContext();
// get MIME type of the file
String mimeType = context.getMimeType(fullPath);
// set content attributes for the response
System.out.println(mimeType);
response.setContentType(mimeType);
response.setContentLength((int) downloadFile.length());
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
response.setHeader(headerKey, headerValue);
return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
}
@GetMapping("/download2")
public ResponseEntity<StreamingResponseBody> advancedDownload2() throws Exception {
String fullPath = "abc.iso";
FileSystemResource file = new FileSystemResource(fullPath);
InputStream inputStream = file.getInputStream();
StreamingResponseBody responseBody = outputStream -> {
int numberOfBytesToWrite;
byte[] data = new byte[1024];
while ((numberOfBytesToWrite = inputStream.read(data, 0, data.length)) != -1) {
outputStream.write(data, 0, numberOfBytesToWrite);
}
inputStream.close();
};
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", String.format("attachment; filename=%s", file.getFilename()));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(responseBody);
}
获取 outputstream ,边读边写
@GetMapping("/download3")
public void download3(HttpServletResponse response) throws Exception {
String fullPath = "abc.iso";
FileSystemResource file = new FileSystemResource(fullPath);
String filename = file.getFilename();
InputStream inputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
try {
inputStream = file.getInputStream();
bufferedInputStream = new BufferedInputStream(inputStream);
//获取输出流
bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
FileCopyUtils.copy(bufferedInputStream, bufferedOutputStream);
}catch(Exception e){
throw e;
}finally {
if(null!=inputStream){
inputStream.close();
}
if(null!=bufferedInputStream){
bufferedInputStream.close();
}
if(null!=bufferedOutputStream){
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
}
}