文件流返回指的是将指定文件通过HTTP返回给客户端浏览器,并且支持文件的下载、打开与预览等操作。在Java中,实现文件流返回的方案有多种,下面将从不同的角度进行详细阐述。
一、使用HttpServletResponse实现文件流返回
在Java Web应用开发中,可以使用HttpServletResponse对象的OutputStream属性向客户端浏览器输出文件流内容,从而实现文件的返回。具体代码示例如下:
@RequestMapping("/downloadFile")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = "D:/example.pdf";
String fileName = "example.pdf";
File file = new File(filePath);
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = response.getOutputStream();
bis = new BufferedInputStream(new FileInputStream(file));
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, i);
i = bis.read(buff);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
}
}
二、使用Spring MVC提供的文件下载功能实现文件流返回
在Spring MVC框架中,提供了方便的文件下载功能。只需要在Controller方法上添加ResponseEntity类型方法返回值即可,具体代码示例如下:
@RequestMapping("/downloadFile")
public ResponseEntity downloadFile(HttpServletRequest request) throws IOException {
String filePath = "D:/example.pdf";
String fileName = "example.pdf";
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
File file = new File(filePath);
byte[] bytes = FileUtils.readFileToByteArray(file);
return new ResponseEntity(bytes, headers, HttpStatus.OK);
}
三、使用Apache Commons IO提供的文件下载功能实现文件流返回
除了Spring MVC提供的文件下载功能外,也可以使用Apache Commons IO提供的文件下载功能实现文件流返回。具体代码示例如下:
@RequestMapping("/downloadFile")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = "D:/example.pdf";
String fileName = "example.pdf";
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
File file = new File(filePath);
InputStream inputStream = FileUtils.openInputStream(file);
OutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream, outputStream);
outputStream.flush();
outputStream.close();
inputStream.close();
}
四、使用Servlet API提供的文件下载功能实现文件流返回
Servlet API提供了文件下载功能的实现方式,具体代码示例如下:
@RequestMapping("/downloadFile")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = "D:/example.pdf";
String fileName = "example.pdf";
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
ServletOutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
}
五、代码实现对比分析
从上述不同实现方案的代码示例中,可以看出相对来说,使用Spring MVC提供的文件下载功能代码相对简洁明了,但是需要引入Spring MVC相关依赖。使用Apache Commons IO提供的文件下载功能相对来说代码较为简单,但依赖Apache Commons IO库。使用HttpServletResponse实现文件流返回代码较为复杂,但是效率相对来说最高。如果项目中已经引入Servlet API相关依赖,可以选择使用Servlet API提供的文件下载功能。
综上所述,根据各自项目特点和需求,选择不同的文件流返回实现方式,既能够满足需求,也能够保证代码的可读性和简洁性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/284558.html
微信扫一扫
支付宝扫一扫