Java 将多个图像设置为响应实体
我想返回多个图像到客户端的响应。在客户端,我想下载这些图片。我还没有为HttpServletResponse找到任何类似.setEntity()的方法。所以我决定在标题字段中添加图像。我以以下方式补充:Java 将多个图像设置为响应实体,java,http,httpresponse,response-headers,Java,Http,Httpresponse,Response Headers,我想返回多个图像到客户端的响应。在客户端,我想下载这些图片。我还没有为HttpServletResponse找到任何类似.setEntity()的方法。所以我决定在标题字段中添加图像。我以以下方式补充: File sourceFile = new File(serverLocation + "/" + filename); servletresponse.setContentType(new MimetypesFileTypeMap().getContentType(sourceFile));
File sourceFile = new File(serverLocation + "/" + filename);
servletresponse.setContentType(new MimetypesFileTypeMap().getContentType(sourceFile));
servletresponse.setContentLength((int)sourceFile.length());
servletresponse.setHeader(filename, "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
我无法在客户端下载。这就是我在客户端所做的
CloseableHttpResponse response = httpclient.execute(httppost);
Header[] headers = response.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
if (headers[i].getName().equals(filename)) {
imagename = headers[i].getValue();
}
}
InputStream fileInputStream = new ByteArrayInputStream(imagename.getBytes(StandardCharsets.UTF_8));
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
fileOutputStream.write(bufffer, 0, bufferSize);
}
CloseableHttpResponse-response=httpclient.execute(httppost);
Header[]headers=response.getAllHeaders();
对于(int i=0;i0){
write(buffer,0,bufferSize);
}
然而,它不是在写图像。如何添加多个文件并在客户端下载。请提供帮助。单个HTTP调用只能返回单个图像(内容)。如果需要发送多个图像,您可以:
- 文件名不是图像。它只是标识文件的文本
- 文件的内容是一个字节序列,它与名称完全分离。这是实际的图像数据
String[] filenames = { /* ... */ };
servletresponse.setContentType("application/zip");
try (ZipOutputStream zip = new ZipOutputStream(
servletresponse.getOutputStream())) {
for (String filename : filenames) {
ZipEntry entry = new ZipEntry(filename);
zip.putNextEntry(entry);
Files.copy(Paths.get(filename), zip);
}
}
第二种方法需要JavaMail API和Java激活框架API。如果您运行的是真正的JavaEE服务器,比如GlassFish或JBoss,那么您已经可以访问它们了,因为JavaMail和JAF是JavaEE规范所要求的组件
String[] filenames = { /* ... */ };
MimeMultipart multipart = new MimeMultipart("mixed");
for (String filename : filenames) {
MimeBodyPart part = new MimeBodyPart();
part.attachFile(filename, null, "base64");
multipart.addBodyPart(part);
}
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setContent(multipart);
message.saveChanges();
servletresponse.setContentType(multipart.getContentType());
try (OutputStream out = servletresponse.getOutputStream()) {
multipart.writeTo(out);
}
每种方法都需要在客户端进行不同的处理。客户端可以直接保存zip存档:
String home = System.getProperty("user.home");
try (InputStream content = response.getEntity().getContent()) {
Files.copy(content, Paths.get(home, "Downloads", "images.zip"));
}
当然,您也可以使用读取zip存档中的条目,并将每个zip条目保存到名称与zip条目名称匹配的文件中
多部分响应需要能够读取MIME多部分消息的API。JavaMail和JAF就是这样的选项之一