Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多个图像设置为响应实体_Java_Http_Httpresponse_Response Headers - Fatal编程技术网

Java 将多个图像设置为响应实体

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));

我想返回多个图像到客户端的响应。在客户端,我想下载这些图片。我还没有为HttpServletResponse找到任何类似.setEntity()的方法。所以我决定在标题字段中添加图像。我以以下方式补充:

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调用只能返回单个图像(内容)。如果需要发送多个图像,您可以:

  • 在响应中传递图像URL,而不是实际的资源,并让客户端解析和下载它们
  • 如果你想隐藏对主体的响应,你可以使用标题来达到和你在例子中提到的相同的目的(但在我看来这是一个奇怪的用例)
    • 文件名不是图像。它只是标识文件的文本
    • 文件的内容是一个字节序列,它与名称完全分离。这是实际的图像数据
    在响应中发送文件名不会发送内容

    在HTTP响应中发送多个图像有两种常见方式:

  • 发送包含多个文件的存档文件,例如zip文件
  • 发送内容类型为多部分/混合的响应,如中所述。您可以手动执行此操作,但包的类使其更容易
  • 这两种方法都要求图像位于响应体中,而不是标题中。标题仅用于(相对)较短的字符串,标题名称对其可能包含的字符有限制

    zip文件方法是最容易编码的方法:

    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就是这样的选项之一