3

NBR API の NBRFileOpenService 呼び出しを使用して WebEx 録画をダウンロードするための Java プロセスを作成しています。記録ファイルの内容が添付されたマルチパート応答を返します。以下のコードで多少動作します。ただし、記録ファイルが十分に大きい場合、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--

私のコード:

public void retrieveRecordingFile(String uri, String recordId, String serviceType) throws Exception {
    HttpClient httpClient = generateHttpClient();
    
    HttpPost httpPost = new HttpPost(uri);
    httpPost.addHeader("Content-Type", ContentType.APPLICATION_XML.getMimeType());
    httpPost.addHeader("SOAPAction", "NBRFileOpenService");
    
    String requestXml = buildNBRDownloadFileXml(recordId, serviceType);
    HttpEntity httpEntity = new ByteArrayEntity(requestXml.getBytes(Charset.forName("UTF-8")));
    
    httpPost.setEntity(httpEntity);
    HttpResponse httpResponse = httpClient.execute(httpPost);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
        MimeMultipart mimeMultipart = new MimeMultipart(new ByteArrayDataSource(httpResponse.getEntity().getContent(), "multipart/form-data"));
        String filename = null;
        File targetFile = null;
        for (int i = 0; i < mimeMultipart.getCount(); i++) {
            if (i == 1) {
                filename = retrieveFileName(mimeMultipart.getBodyPart(i).getInputStream());
            } else if (i == 2) {
                targetFile = new File(DOWNLOAD_DIR + filename);
                FileUtils.copyInputStreamToFile(mimeMultipart.getBodyPart(i).getInputStream(), targetFile);
            }
        }
    }
}

どんな助けでも本当に感謝しています。

4

0 に答える 0