java 根据文件List<InputStream> HttpServletResponse response 批量下载文件
时间: 2024-09-18 17:10:14 浏览: 107
在Java中,如果你想通过`HttpServletResponse`将一个`List<InputStream>`作为多个文件批量下载给客户端,可以按照以下步骤操作:
1. **创建文件流**:
对每个`InputStream`,你需要创建一个新的`FileOutputStream`来保存到本地临时文件中。
```java
List<File> downloadedFiles = new ArrayList<>();
for (InputStream inputStream : fileList) {
File tempFile = File.createTempFile("download-", ".tmp");
try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(tempFile))) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
downloadedFiles.add(tempFile);
} catch (IOException e) {
// 处理异常
}
}
```
2. **设置响应头**:
设置HTTP响应头,告知浏览器这是一个二进制数据,并允许用户下载。
```java
String contentType = "application/octet-stream";
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment; filename=download_files.zip"); // 使用文件名或自定义名称
```
3. **读取并输出临时文件**:
将每个临时文件的内容写入HTTP响应。
```java
try (FileInputStream fis = new FileInputStream(downloadedFiles.get(i));) {
ServletOutputStream sos = response.getOutputStream();
byte[] bytes = new byte[8192];
int length;
while ((length = fis.read(bytes)) > 0) {
sos.write(bytes, 0, length);
}
fis.close();
sos.flush();
}
```
4. **循环遍历并下载所有文件**:
循环上述过程,直到所有的`InputStream`都处理完毕。
5. **关闭资源**:
最后记得关闭所有打开的流。
```java
finally {
for (File file : downloadedFiles) {
if (!file.delete()) {
System.out.println("Could not delete temp file: " + file.getAbsolutePath());
}
}
response.flushBuffer(); // 清空缓冲区,确保文件完全发送
response.getWriter().flush();
}
```
阅读全文