我正在开发一款与 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);
我只是不明白问题出在哪里。
谢谢
编辑以包含评论者要求的更多信息: 假设有 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?