代码之家  ›  专栏  ›  技术社区  ›  Dan Polites

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

  •  0
  • Dan Polites  · 技术社区  · 16 年前

    我正在使用下面的代码从Web服务器检索附件。本例中的客户端是web浏览器。因此,当前,用户向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 回复  |  直到 16 年前
        1
  •  0
  •   Orbling    13 年前
    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();