【问题标题】:How to create MIME-atachment text/xml in Java?如何在 Java 中创建 MIME 附件文本/xml?
【发布时间】:2015-08-30 12:36:48
【问题描述】:

如何为我的 SOAPMessage 创建 mime-attachment text/xml

我有一个函数,它发送 XML 的二进制文件。但我不知道该怎么做。

【问题讨论】:

    标签: java web-services soap mime


    【解决方案1】:
    1. 在客户端使用DataHandler/DataSource将二进制数据推送到消息中。

    2. 在服务器端,你需要创建一个DataContentHandler实现并注册到激活框架中。

    第 1 步 - 添加二进制附件

    实现一个简单的 DataSource 来获取数据:

    import javax.activation.*;
    
        class BinaryDataSource implements DataSource {
            InputStream _is;
    
            public BinaryDataSource(InputStream is) {
                _is = is;
            }
            public String getContentType() { return "application/binary"; }
            public InputStream getInputStream() throws IOException { return _is; }
            public String getName() { return "some file"; }
            public OutputStream getOutputStream() throws IOException {
                throw new IOException("Cannot write to this file");
            }
        }
    

    现在使用此代码添加附件:

            InputStream data = ...
            SOAPMessage msg = ...
            DataHandler dh = new DataHandler(new BinaryDataSource(data));
            AttachmentPart attachment = msg.createAttachmentPart(dh);
            msg.addAttachmentPart(attachment);
    

    第 2 步 - 设置服务器端

    [注意:这对我有用]

    创建一个处理“应用程序/二进制”类型的传入附件的 DataContentHandler。

    import javax.activation.*;
    import java.io.*;
    
    public class BinaryDataHandler implements DataContentHandler {
    
        /** Creates a new instance of BinaryDataHandler */
        public BinaryDataHandler() {
        }
    
        /** This is the key, it just returns the data uninterpreted. */
        public Object getContent(javax.activation.DataSource dataSource) throws java.io.IOException {
            System.out.println("BinaryDataHandler: getContent called with: " + dataSource);
            return dataSource.getInputStream();
        }
    
        public Object getTransferData(java.awt.datatransfer.DataFlavor dataFlavor, 
                             javax.activation.DataSource dataSource) 
                              throws java.awt.datatransfer.UnsupportedFlavorException, 
       java.io.IOException {
            return null;
        }
    
        public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {
            return new java.awt.datatransfer.DataFlavor[0];
        }
    
        public void writeTo(Object obj, String str, java.io.OutputStream outputStream) 
         throws java.io.IOException {
            // You would need to implement this to have
            // the conversion done automatically based on
            // mime type on the client side.
        }
    }    
    

    现在,您可以使用此代码获取附件的数据:

         SOAPMessage msg = ... //received message
         Iterator ats = msg.getAttachments();
         if( ats.hasNext() ){
              AttachmentPart attachment = (AttachmentPart)ats.next();
              InputStream contents = (InputStream)attachment.getContent();
         }
    

    最后,您需要注册您的 DataContentHandler 以便激活框架使用它。有几种方法(请参阅激活框架 javadocs 中的 MailcapCommandMap)。我所做的是在我的“java”解释器使用的 lib 目录中创建一个名为“mailcap”的文件。

    这个文件看起来像这样:

    应用程序/二进制文件;二进制数据处理程序 应用程序/二进制文件;; x-java-content-handler=BinaryDataHandler

    这告诉激活框架将您的处理程序用于指定的 MIME 类型。

    【讨论】:

    • 如果我需要下一个结构:Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml; start="<TEST>" --MIME_boundary Content-Type: text/xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID:<TEST> 最后:--MIME_boundary Content-Type: application/zip Content-Transfer-Encoding: binary Content-ID: <package1> <!-- attach --> --MIME_boundary 我该怎么做?
    猜你喜欢
    • 2015-11-18
    • 2012-05-21
    • 2019-03-04
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多