如何在java中将多个输入流写入输出流?

问题描述 投票:0回答:0

我正在开发一款与 DocuSign 合作的应用程序,一个问题是信封大小限制为 33mb,所以我必须将其分解。那么应用程序必须从 DocuSign 接收它,我们的视图可以工作,但不能下载。因此,当它从 DocuSign 下载回来时,它将采用 zip 文件夹的形式,其中包含图像(收据)。假设发送了 3 个信封,它会以

InputStream
的形式将它们读回,并将其存储到名为
List
inputStreams
中。只需将一个
InputStream
写入下载到下载文件夹中的
OutputStream
即可,但我希望将所有 3 个信封/
InputStream
的图像下载为包含所有这些的 zip 文件夹。 (另一种方法是单独下载所有 3 个 zip 文件夹,但这不起作用,因为 Java 无法一次下载多个内容)。所以这是我正在使用的代码,只是不明白为什么它不起作用:

OutputStream outputStream = response.getOutputStream();
for (int i = 0; i<inputStreams.size(); i++)
{
    InputStream inputStream = inputStreams.get(i);
    int bytesRead = -1;
    byte[] buffer = new byte[1024];
    while ((bytesRead = inputStream.read(buffer)) != -1)
    {
        outputStream.write(buffer, 0, bytesRead);
    }
    Library.closeResource(inputStream);
}

结果是第一个信封的收据将在拉链中,但不是信封 2 和 3 中的收据。如果我以不同的顺序进行操作,则可以得到 2,但不能得到 1 和 3。或者可以得到 3但不是 1 和 2。所以它正确保存了

inputStreams
列表中的数据。只是无法将它们全部写入 zip 文件夹中。

此外,下载的 zip 每次都会有最后一个的名称(这对我们来说没问题),这是因为上面的这段代码从 DocuSign 获取所有信封并将它们添加到

List
InputStream
s。请注意,
OutputStream
是从响应对象中获取的(见上文)。

response.setHeader("Content-Disposition", disposition);System.out.println("dispo "+disposition);
response.setContentType(contentType);System.out.println("contentType "+contentType);
response.setContentLength(contentLength);System.out.println("contentLength "+contentLength);

我只是不明白问题出在哪里。

  1. 我应该继续尝试将所有 3 个信封的内容放入一个 zip 文件中,还是应该尝试分别下载 3 个信封(我说 3 个,因为当有多个信封时。通常会是 2 个或 3 个)。
  2. 如果我继续尝试将所有 3 个信封的内容放入一个 zip 文件中,那么问题是什么?

谢谢

编辑以包含评论者要求的更多信息: 假设有 3 个信封,打印输出的标题将如下所示: 分配文件;文件名=“ER00000007_-13.zip”;文件名*=UTF-8''ER00000007-13.zip 内容类型 应用程序/zip 内容长度21607211 分配文件;文件名=“ER00000007-23.zip”;文件名*=UTF-8''ER00000007-23.zip 内容类型 应用程序/zip 内容长度21607195 分配文件;文件名=“ER00000007-33.zip”;文件名*=UTF-8''ER00000007-_33.zip 内容类型 应用程序/zip 内容长度 21607211

因此,我们抓取所有信封并将它们添加到输入流列表中,然后尝试下载所有信封,这就是为什么 zip 文件夹始终命名为“ER00000007_-_33.zip”,因为这是从 docusign 抓取的最新一个。是的,我没有提到我正在与 docusign 合作,但这就是我正在做的事情。所以也许问题在于,当我尝试将其他 2 个信封内容也推入其中时,输出流 contentLength 设置为 21607211?

java zip inputstream outputstream
© www.soinside.com 2019 - 2024. All rights reserved.