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

如何在Java中从HttpResponse获取一个表单字段并将其写入文件?,java,zip,httpresponse,multipartform-data,mime,Java,Zip,Httpresponse,Multipartform Data,Mime,我正在调用一个客户端的下载服务,该服务发送回MIME数据,并试图保存一个zip文件 该服务不仅返回文件本身,还返回其他几个MIME字段。因此,当我使用entity.getContent()打开inputstream时,我最终会将所有这些数据写入我的zip文件,而我只希望写入一部分“有效负载”。我已经搜索过了,但没有看到从内容中只获得一个单独的部分 代码如下: HttpResponse response = services.getFileByPayloadID("12345-abcde");

我正在调用一个客户端的下载服务,该服务发送回MIME数据,并试图保存一个zip文件

该服务不仅返回文件本身,还返回其他几个MIME字段。因此,当我使用entity.getContent()打开inputstream时,我最终会将所有这些数据写入我的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) {}
}
生成的文件的内容如下所示。请注意,我只希望将“Payload”的实际二进制内容写入该文件。任何指点或建议都将不胜感激

----2017080311634 内容配置:表单数据;name=“PayloadType”

X12_999_响应_005010X231A1 ----20170803161934 内容配置:表单数据;name=“ProcessingMode”

批处理 ----20170803161934 内容配置:表单数据;name=“PayloadID”

12345 abcde ----20170803161934 内容配置:表单数据;name=“时间戳”

2017-08-08T16:46:34Z ----20170803161934 内容配置:表单数据;name=“CORERuleVersion”

2.2.0 ----20170803161934 内容配置:表单数据;name=“接收方”

99000061 ----20170803161934 内容配置:表单数据;name=“SenderID”

公共医疗补助 ----20170803161934 内容配置:表单数据;name=“ErrorCode”

成功 ----20170803161934 内容配置:表单数据;name=“ErrorMessage”

----2017080311634 内容配置:表单数据;name=“有效负载”

PKÁIKšŽÌ*>511257719_511257718_837p5010x12批次_9900061.199786.1.999.日期»0E…NvB^lQJT1¥CÀäÛkR)`O–s‰mÏ4æ!æ±G!P+GÄŽ•*>511257719_511257718_837p5010x12批次_9900061.199786.1.999.datPK lñ

----20170803116934

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

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) {}
}

这是一个有趣的问题。。。如果我没记错的话,每个多部分都有一个边界,我想知道您是否可以在服务器解析的请求中指定这个边界,您看到了吗?您可以尝试测试
bodyPart.getHeader(“name”)
是否为
null
,然后测试数组的第一项是否为
“Payload”
,如果是,则将
bodyPart.getInputStream()
保存到zip文件中。非常感谢您,这很好地满足了我的目的!