如何将Axis 2 MTOM临时文件传输到HttpServletRequest

时间:2010-09-29 14:18:55

标签: axis2 mtom

我正在使用以下代码从网络服务器检索附件。在这种情况下,客户端是Web浏览器。因此,目前,用户向网络服务器请求附件。 Web服务器向另一台服务器发出MTOM请求以获取附件。然后,该Web服务器在开始将该附件写入响应之前等待附件下载。用户等待两倍的时间来获取文件。如何使用Axis2代码访问临时文件,以便在创建时将其流式传输给用户?我知道这听起来不是最好的方法,但这是要求。我正在处理高达2GB的大文件,所以等待两倍的时间才能收到文件。

Options options = new Options();
options.setTo(new EndpointReference(this.endpointUrl));
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
options.setProperty(Constants.Configuration.CACHE_ATTACHMENTS, Constants.VALUE_TRUE);
options.setProperty(Constants.Configuration.ATTACHMENT_TEMP_DIR, this.tempDirectory);
options.setProperty(Constants.Configuration.FILE_SIZE_THRESHOLD, String.valueOf(this.tempFileSizeThreshold));
options.setTimeOutInMilliSeconds(this.serviceRequestTimeOut);

sender = new ServiceClient();
sender.setOptions(options);

OMElement result = sender.sendReceive(this.getAttachmentPayload(productId, attachmentId));

OMElement attachmentElement = result.getFirstElement();

Iterator<OMElement> elementIterator = attachmentElement.getChildElements();

String fileName = "";
DataHandler dataHandler = null;

while (elementIterator.hasNext()) {
    OMElement element = elementIterator.next();

    if (element.getQName().getLocalPart().equals("name")) {
        fileName = element.getText();
    } else if (element.getQName().getLocalPart().equals("attachment")) {
        dataHandler = (DataHandler) ((OMText) element.getFirstOMChild()).getDataHandler();
    }
}

1 个答案:

答案 0 :(得分:0)

org.w3.www._2005._05.xmlmime.Base64Binary b64data = ---YOUR_SOURCE_ATTACHMENT---;

org.apache.axiom.attachments.CachedFileDataSource ds = (CachedFileDataSource) b64data.getBase64Binary().getDataSource();

String absPath = ds.getFile().getAbsolutePath();