如何从 Java 中的 HttpResponse 中获取单个表单字段并将其写入文件?

Posted

技术标签:

【中文标题】如何从 Java 中的 HttpResponse 中获取单个表单字段并将其写入文件?【英文标题】:How to obtain just a single form field from an HttpResponse in Java and write it to a file? 【发布时间】:2018-01-16 14:25:03 【问题描述】:

我正在调用客户端的下载服务,该服务会发回 MIME 数据并尝试保存 zip 文件。

该服务不仅返回文件本身,还返回其他几个 MIME 字段。因此,当我使用 entity.getContent() 打开输入流时,我最终会将所有这些数据写入我的 zip 文件,而我只想写一部分“有效负载”。我已经搜索并没有看到从内容中仅获取一个单独的部分。

代码如下:

HttpResponse response = services.getFileByPayloadID("12345-abcde");

BufferedInputStream bis = null;
try 
    bis = new BufferedInputStream(response.getEntity().getContent());
 catch (UnsupportedOperationException | IOException e) 
    e.printStackTrace();

String filePath = "c:\\sample.zip";
BufferedOutputStream bos = null;
try 
    bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));

    int inByte;

    while((inByte = bis.read()) != -1) 
        bos.write(inByte);
    
 catch (IOException e) 
    e.printStackTrace();
 finally 
    try bis.close(); catch (Exception e) 
    try bos.close(); catch (Exception e) 

生成的文件内容如下所示。请注意,我只想将“有效负载”的实际二进制内容写入文件。任何指针或建议将不胜感激!

----20170803161934 内容处置:form-data;name="PayloadType"

X12_999_Response_005010X231A1 ----20170803161934 内容处置:form-data;name="ProcessingMode"

批次 ----20170803161934 内容处置:form-data;name="PayloadID"

12345-abcde ----20170803161934 内容处置:form-data;name="TimeStamp"

2017-08-08T16:46:34Z ----20170803161934 内容处置:form-data;name="CORERuleVersion"

2.2.0 ----20170803161934 内容处置:form-data;name="ReceiverID"

99000061 ----20170803161934 内容处置:form-data;name="SenderID"

KYMEDICAID ----20170803161934 内容处置:form-data;name="ErrorCode"

成功 ----20170803161934 内容处置:form-data;name="ErrorMessage"

----20170803161934 内容处置:表单数据; name="有效负载"

PK ÁIKšŽÌ*• * > 511257719_511257718_837P5010X12BATCH_99000061.199786.1.999.date»Â0E...ùNvB^lQJT1¥CéÀ§äÛkR)`O¾Ç:–s‰ ¥×Ï´m~_GÄ4æ!•ŽŽÏ´P+Ë_GÄ4æ!• * > 511257719_511257718_837P5010X12BATCH_99000061.199786.1.999.datPK lñ ----20170803161934

【问题讨论】:

这是一个有趣的问题...如果我没记错的话,每个多部分都有一个边界,我想知道您是否可以在请求中指定由服务器解析 你见过this吗?您可以尝试测试bodyPart.getHeader("name") 不是null,然后测试数组的第一项是否为"Payload",如果是,则将bodyPart.getInputStream() 保存到一个zip 文件中。 【参考方案1】:

您的解决方案是读取字节,将其解析为字符串 => 将此字符串与您要开始写入内容的模式进行比较(在您的情况下是“有效负载”)。当您达到此模式时,开始将流的其他部分写入文件。这是给你的示例代码:

HttpResponse response = services.getFileByPayloadID("12345-abcde");
ByteArrayOutputStream buf = new ByteArrayOutputStream();
BufferedInputStream bis = null;
try 
    bis = new BufferedInputStream(response.getEntity().getContent());
 catch (UnsupportedOperationException | IOException e) 
    e.printStackTrace();

String filePath = "c:\\sample.zip";
BufferedOutputStream bos = null;
try 
    bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
    String output = "";
    int inByte;
    String charset = "your-charset"; //using charset to ensure that you can parse string correct to compare it.
    boolean start = false;
    while((inByte = bis.read()) != -1) 
        if (!start)
            buf.write((byte) inByte);
            output = buf.toString(charset);
            if (output.endsWith("name=\"Payload\"")) //compare with your pattern to determine when will start write to file
                start = true;
            
        
        if(start)
            bos.write(inByte);
        
    
 catch (IOException e) 
    e.printStackTrace();
 finally 
    try bis.close(); catch (Exception e) 
    try bos.close(); catch (Exception e) 

【讨论】:

非常感谢,这很好地满足了我的目的!

以上是关于如何从 Java 中的 HttpResponse 中获取单个表单字段并将其写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中怎样得到一个HttpResponse对象

如何从 Apache HttpClient5 的 HttpResponse 中获取响应体?

从 org.apache.http.HttpResponse 获取 HTTP 代码

PC 上的 Android 与 Java:不同的 HttpResponse?

java如何修改request header

Java HttpResponse 提取数据