1

我在将 DataHandler 与 jax-ws 一起使用时遇到问题。当客户端调用 DataHandler 的 getName() 方法时,返回一个空字符串。在服务器端,它的价值是正确的。这里我报告一下服务器端和客户端的部分代码:

服务器端

public @XmlMimeType("application/octet-stream") DataHandler fileDownload(String name) {
   try {
         File file = new File("/tmpwk/share/SharedRepository/apps-data/jaxws-large_upload/" + name);
         FileDataSource fds = new FileDataSource(file);
     DataHandler dh = new DataHandler(fds);
         // Note: getName(), return a String with file name.
     System.out.println("File Name = " + dh.getName() );
     System.out.println("Content Type  " + dh.getContentType());

     System.out.println("quiting from downloadFile...");    
     return dh;
    } catch(Exception e) {
        throw new WebServiceException(e);
    }

}

客户端

public void download() throws IOException {
    System.out.println(">>>>> download <<<<<<");
    MTOMFeature feature = new MTOMFeature();
    UploadImplService service = new UploadImplService();
    UploadImpl proxy = service.getUploadImplPort(feature);        
    Map<String, Object> ctxt = ((BindingProvider)proxy).getRequestContext();
    ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); 


    DataHandler dh = proxy.fileDownload("file.bin");
    InputStream in = dh.getInputStream();

    //Note:  getName() return a empty string, why ????
            System.out.println("File Name = " + dh.getName());
    System.out.println("Content Type = " + dh.getContentType());


    File file = new File("/tmp/dfile.bin");
    OutputStream out = new FileOutputStream(file);

    // Transfer bytes from in to out
    byte[] buf = new byte[8192];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

为什么会这样?

4

3 回答 3

1

今天我遇到了同样的情况。幸运的是,我找到了原因。

如果您深入调试源代码,您会发现在 JAX-WS 中,DataHandler 类型的参数或结果将被包装到一个 MIMEPartStreamingDataHandler 中。

MIMEPartStreamingDataHandler 的数据源是一个内部类,称为 StreamingDataSource。由 DataHandler 定义,它的 getName 方法应该由它的 dataSource 委托。但是,StreamingDataSource 的getName 方法,只是返回一个空的String ""。就像:

public String getName() {
    return "";
}

您可以在此处查看源代码概览。

此问题的一种可能解决方案是:

  1. 为您的上传服务方法提供另一个参数以指定其名称。
  2. 使用 String 属性包装您的结果。
于 2013-10-24T21:36:33.547 回答
0

我也遇到了同样的问题,但是我如何使用 StreamingDataHandler,并且我的代码有效。

dh=proxy.get("file.bin");   //WS CALL
if( dh!=null){          
    StreamingDataHandler sdh = (StreamingDataHandler)dh;            
    File file = new File(filePath+ File.separator +fileName);
    sdh.moveTo(file);
 }
于 2012-10-01T10:08:15.253 回答
0

我有同样的问题,它让我忙了一段时间。尽管看起来很奇怪,但我终于发现文件名是在 DataHandler 对象的 contentType 属性中提供的!以下是导出文件名的方法:

String contentType = dataHandler.getContentType();
//if you print out contentType, it is something like this:  "application/pdf; name=9ad22859-cdc9-4de5-b374-2c36acc5c253.pdf"
String fileName = (contentType.substring(contentType.indexOf("name=") + 5)).trim();

干杯!

于 2015-03-18T01:55:28.170 回答