Java 是否将多个映像写入ServletOutStream?

Java 是否将多个映像写入ServletOutStream?,java,servlets,java-io,Java,Servlets,Java Io,我需要从web服务(例如:List)获取多个图像,并且必须将这些图像写入ServletOutputStream 当我点击“查看”链接时,它调用servlet,该servlet调用webservice并以列表形式接收多个图像 现在我正试图将这些图像写入ServletOutputStream,但它不起作用 正在尝试以zip格式发送图像 response.setContentType("application/zip"); OutputStream os = null; BufferedOutpu

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

当我点击“查看”链接时,它调用servlet,该servlet调用webservice并以列表形式接收多个图像

现在我正试图将这些图像写入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();

        }
    }
response.setContentType(“应用程序/zip”);
OutputStream os=null;
BufferedOutputStream bos=null;
ZipOutputStream zos=null;
试一试{
os=resp.getOutputStream();
bos=新的缓冲输出流(os);
zos=新ZipoutStream(bos);
setLevel(ZipOutputStream.storage);
发送多文件(zos、annotContent、“显示”);
}捕获(IOE异常){
响应设置状态(HttpServletResponse.SC_内部_服务器_错误);
}最后{
如果(zos!=null){
zos.finish();
zos.flush();
}
bos.close();
os.close();
}
私有void sendpultiplefile(zipoutpstream zos、集合filesToSend、字符串名)引发IOException{
myLogger.info(“sendMultipleFiles被调用…”);
for(字节[]f:filesToSend){
InputStream inStream=null;
ZipEntry ze=null;
试一试{
inStream=新的ByteArrayInputStream(f);
ze=新ZipEntry(名称+“-存档”);
setComment(“虚拟文件”);
佐斯·普特内森特里(泽);
int readByte=0;
而((readByte=inStream.read())!=-1)
{
写入(读字节);
}
}捕获(IOE异常){
System.out.println(“找不到”);
}最后{
如果(ze!=null){
zos.closeEntry();
}
流内关闭();
}
}

上面的代码不起作用。请提供任何建议。

您的解决方案将取决于您提供的内容类型-如果您提供的是HTML响应,则可以通过将图像存储在磁盘上(并写入图像显示端点)或如果图像很小-将字节作为字节发送来解决问题

如果您的响应类型不是HTML-这里有一些选项-您可以返回一个

不太标准的使用servlet的方法

编辑:
根据注释,mime类型为JPEG-一个选项是将JPEG合并成一个更大的(无法发送多个)。组合二进制文件的字节-JPEG有自己的压缩格式以及页眉、页脚和EXIF信息-您可能需要专门的API将它们组合成一个。这是我遇到的一个。如果组合JPG不是一个选项-您试图实现的目标不能在一次写入中完成。

您应该创建一个zip文件并添加e每个图像一个接一个地放在那里。然后,将zip文件的内容写入输出流。这种情况下的客户端是什么?通常你会提供HTML,它会引用多个图像,每个图像都会引起一个单独的请求。请给我们更多的上下文。@Jon Skeet:使用JSF。。当我单击“查看”链接时,它必须调用servlet并响应nse(图像)应该显示为弹出窗口。所以浏览器中显示的是HTML?在这种情况下,我建议您开始考虑浏览器将看到什么-哪个是HTML的一个响应,然后会触发每个图像的请求…没有HTML..当我单击链接时,它会调用servlet,响应会自动显示在ne中w弹出窗口。我的Mime类型是:图像/jpeg-不使用html尝试合并PDF并写入输出流..修改了代码..请参考上文我看不到您在评论中提到的内容,但是我编辑了答案-希望有帮助。不工作是什么意思?有堆栈跟踪或e共享错误?通过使用API合并图像并写入OutputStream解决了此问题。