我需要从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();
}
}
以上代码无效。任何建议都将受到赞赏..
答案 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不是一个选项 - 你想要实现的目标不能在一次写入中完成。