java - 如何将可下载文件放入 HttpServletResponse?

标签 java jakarta-ee servlets httpresponse outputstream

我有以下问题:我有一个 HttpServlet 创建一个文件并将其返回给必须以下载形式接收它的用户

byte[] byteArray = allegato.getFile();

InputStream is = new ByteArrayInputStream(byteArray);
Base64InputStream base64InputStream = new Base64InputStream(is);

int chunk = 1024;
byte[] buffer = new byte[chunk];
int bytesRead = -1;

OutputStream out = new ByteArrayOutputStream();

while ((bytesRead = base64InputStream.read(buffer)) != -1) {
    out.write(buffer, 0, bytesRead);
}

如您所见,我有一个 byteArray 对象,它是一个字节数组 (byte[] byteArray),我用这种方式将它转换成一个文件:

  1. 首先,我将它转换成一个 InputStream 对象。

  2. 然后我将 InputStream 对象转换为 Base64InputStream

  3. 最后,我在 ByteArrayOutputStream 对象(OutputStream out 对象)上写了这个 Base64InputStream

我认为到这里应该没问题(是没问题还是我在创建文件时遗漏了什么?)

现在我的 servlet 必须将此文件作为下载返回(因此用户必须将下载接收到浏览器中)。

那么我要怎么做才能获得这种行为呢?我认为我必须将这个 OutputStream 对象放入 Servlet 响应中,例如:

ServletOutputStream stream = res.getOutputStream();

但我不知 Prop 体怎么做?我还需要为文件设置特定的 MIME 类型吗?

最佳答案

这很容易做到。

byte[] byteArray = //your byte array

response.setContentType("YOUR CONTENT TYPE HERE");
response.setHeader("Content-Disposition", "filename=\"THE FILE NAME\"");
response.setContentLength(byteArray.length);
OutputStream os = response.getOutputStream();

try {
   os.write(byteArray , 0, byteArray.length);
} catch (Exception excp) {
   //handle error
} finally {
    os.close();
}

编辑: 我注意到您首先从 base64 解码数据,您应该执行以下操作:

OutputStream os = response.getOutputStream();
byte[] buffer = new byte[chunk];
int bytesRead = -1;

while ((bytesRead = base64InputStream.read(buffer)) != -1) {
    os.write(buffer, 0, bytesRead);
}

你不需要中间的 ByteArrayOutputStream

关于java - 如何将可下载文件放入 HttpServletResponse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27375192/

相关文章:

java - 如何知道一个列表有一个特定的索引?

hibernate - Spring MVC Hibernate + SQLite 不创建数据库

servlets - portlet/servlet 抽象

java - servlet 中的图像无法用浏览器打开

tomcat - 受防火墙保护的 ActiveMQ 服务器的 WS 代理

java - 如何创建振幅上下限的正弦波

java - 如何更改 Apache Tiles 中图 block 评估的顺序?

java - 如何使用java访问名称中包含空格字符的文件?

java - addShutDownHook 的内存泄漏

tomcat 服务器上的 javax.net.ssl.SSLHandshakeException