Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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_Multipart_Webex - Fatal编程技术网

Java 如何以流的形式读取和解析多部分响应?

Java 如何以流的形式读取和解析多部分响应?,java,multipart,webex,Java,Multipart,Webex,我正在创建一个java进程,使用其NBR API的NBRFileOpenService调用下载WebEx录制。它返回一个带有附加记录文件内容的多部分响应。我用下面的代码做了一些工作。但是,当录制文件足够大时,我会得到OutOfMemoryError异常 录制量很大是很常见的,如果API只单独返回文件,我可以流式下载,但是我不太确定如何安全地处理多部分响应。因此,我想知道是否有任何方法可以读取文件元数据并将二进制内容保存到文件中,而无需将整个响应保存在内存中 API响应格式: ------=_Pa

我正在创建一个java进程,使用其NBR API的NBRFileOpenService调用下载WebEx录制。它返回一个带有附加记录文件内容的多部分响应。我用下面的代码做了一些工作。但是,当录制文件足够大时,我会得到
OutOfMemoryError
异常

录制量很大是很常见的,如果API只单独返回文件,我可以流式下载,但是我不太确定如何安全地处理多部分响应。因此,我想知道是否有任何方法可以读取文件元数据并将二进制内容保存到文件中,而无需将整个响应保存在内存中

API响应格式:

------=_Part_674_458057647.1593732813745
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <AD79B5747EFC01CDDA9A281BA8CDEF0C>

[SOAP RESPONSE]
------=_Part_674_458057647.1593732813745
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: <C498AB4664B57130F869695A1C5B584E>

[FILE METADATA]
------=_Part_674_458057647.1593732813745
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: <003D9EBA1E491CE2E9E5903C996EFD4C>

[BINARY FILE CONTENT]
------=_Part_674_458057647.1593732813745--

----=\u部分\u 674\u 458057647.1593732813745
内容类型:text/xml;字符集=UTF-8
内容传输编码:二进制
内容Id:
[SOAP响应]
------=_零件_674_458057647.1593732813745
内容类型:应用程序/八位字节流
内容传输编码:二进制
内容Id:
[文件元数据]
------=_零件_674_458057647.1593732813745
内容类型:应用程序/八位字节流
内容传输编码:二进制
内容Id:
[二进制文件内容]
------=_零件_674_458057647.1593732813745--
我的代码:

public void retrieveRecordingFile(字符串uri、字符串记录ID、字符串服务类型)引发异常{
HttpClient HttpClient=generateHttpClient();
HttpPost HttpPost=新的HttpPost(uri);
httpPost.addHeader(“内容类型”,ContentType.APPLICATION_XML.getMimeType());
addHeader(“SOAPAction”、“NBRFileOpenService”);
String requestXml=buildnbrlownloadfilexml(recordId,serviceType);
HttpEntity HttpEntity=newbytearrayentity(requestXml.getBytes(Charset.forName(“UTF-8”));
httpPost.setEntity(httpEntity);
HttpResponse HttpResponse=httpClient.execute(httpPost);
如果(httpResponse.getStatusLine().getStatusCode()==200){
MimeMultipart MimeMultipart=new MimeMultipart(new ByteArrayDataSource(httpResponse.getEntity().getContent(),“多部分/表单数据”);
字符串文件名=null;
File targetFile=null;
对于(int i=0;i

非常感谢您的帮助。

您可以添加出现错误的情况,我认为如果您只是增加该应用程序/微服务的内存,问题就会解决,我认为您不需要更多内存。相同的代码适用于较小的文件,没有问题,但检索较大的文件时失败。我担心的是,当前的代码在内存中保存着完整的响应,虽然增加内存可能会暂时解决这个问题,但将来我们可能会有一个更大的记录文件,它可能会失败;一场没完没了的猫捉老鼠的游戏。我真的认为,如果有一种方法可以流式处理响应中的文件内容部分,那么文件大小将与检索过程无关。我还没有成功地找到任何也能做到这一点的库。我想象你的代码可以处理小文件,一般来说,它应该可以处理所有人,但我认为,如果内存多一点,它应该得到管理,我不知道你的内存是少了还是处理的足够。我的一个应用程序也有类似的问题,它下载了大文件,问题是我的微服务只有500mb的ram,我把它改为700mb,我的问题就解决了。这可能无法解决问题,但只是以防万一