将多个图像写入ServletOuputStream?

时间:2015-04-22 14:22:02

标签: java servlets java-io

我需要从web服务获取多个图像(例如:List),并且必须将这些图像写入ServletOutputStream。

当我点击'VIEW'链接时,它会调用servlet,该servlet会调用webservice并以List的形式接收多个图像。

现在我正在尝试将这些图像写入ServletOutputStream,但这种图像无效..

尝试以zip格式发送图像

response.setContentType("application/zip");
  OutputStream os = null;
BufferedOutputStream bos = null;
ZipOutputStream zos = null;     
try{
    os = resp.getOutputStream();
    bos = new BufferedOutputStream(os);

    zos = new ZipOutputStream(bos);
    zos.setLevel(ZipOutputStream.STORED);

    sendMultipleFiles(zos, annotContent,"display");
}catch (IOException e) {
    resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} finally {
    if (zos != null) {
        zos.finish();
        zos.flush();
    }
    bos.close();
    os.close();
}

private void sendMultipleFiles(ZipOutputStream zos, Collection<byte[]> filesToSend, String name) throws IOException {
    myLogger.info("sendMultipleFiles is invoked..");
    for(byte[] f: filesToSend) {

        InputStream inStream = null;
        ZipEntry ze = null;

        try {
            inStream = new ByteArrayInputStream(f);

            ze = new ZipEntry(name + "-archived");
            ze.setComment("Dummy file");

            zos.putNextEntry(ze);
            int readByte = 0;
            while((readByte = inStream.read()) != -1)
            {
                zos.write(readByte);
            }
        } catch (IOException e) {
            System.out.println("Cannot find " );
        } finally {
            if (ze != null) {
                zos.closeEntry();
            }
            inStream.close();

        }
    }

以上代码无效。任何建议都将受到赞赏..

1 个答案:

答案 0 :(得分:1)

您的解决方案将取决于您所服务的内容类型 - 如果您正在提供HTML响应,则可以通过将图像存储在磁盘上(outside the context root并编写图像显示端点)来解决此问题,或者如果图像很小 - 将字节发送为base64 encoding in the image tag directly

如果您的回复类型不是HTML - 这里有一些选项 - 您可以返回ZIP file

使用MultiPart MIME Extension的servlet的标准方法较少。

修改 根据评论,mime类型是JPEG - 一种选择是将JPEG组合成一个较大的(不能发送多个)。结合二进制文件的字节 - JPEG有自己的压缩格式以及页眉,页脚和EXIF信息 - 您可能需要专门的API将它们合并为一个。 Here是我遇到的一个。如果组合JPG不是一个选项 - 你想要实现的目标不能在一次写入中完成。