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

时间:2014-12-09 09:16:42

标签: java java-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 ),我以这种方式将其转换为文件:< / p>

  1. 首先我将其转换为 InputStream 对象。

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

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

  4. 我认为到目前为止它应该没问题(是否可以,或者我在文件创建中遗漏了什么?)

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

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

    ServletOutputStream stream = res.getOutputStream();
    

    但我不知道究竟是怎么做到的?我是否还要为文件设置特定的MIME类型?

1 个答案:

答案 0 :(得分:6)

这很容易做到。

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