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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将可下载文件放入HttpServletResponse?相关的知识,希望对你有一定的参考价值。

我有以下问题:我有一个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. 最后,我将这个Base64InputStream写在ByteArrayOutputStream对象(OutputStream out对象)上。

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

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

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

ServletOutputStream stream = res.getOutputStream();

但我不知道它究竟是怎么做到的?我是否还要为文件设置特定的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

以上是关于如何将可下载文件放入HttpServletResponse?的主要内容,如果未能解决你的问题,请参考以下文章

如何在golang中检查URL是不是可下载?

在$ autoreply下将链接或可下载内容放在php中?

如何在 django 中提供可下载的 zip 文件

从 JavaScript 创建一个可下载的附件?

如何让wireshark支持OpenFlow解析

MVC;将可下载文件返回到视图