如何在 Java 中创建 MIME 附件文本/xml?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

    在客户端使用DataHandler/DataSource将二进制数据推送到消息中。

    在服务器端,你需要创建一个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 我该怎么做?

以上是关于如何在 Java 中创建 MIME 附件文本/xml?的主要内容,如果未能解决你的问题,请参考以下文章

如何解码 [MIME] java 邮件中的附件文件

如何在 C# 中编码二进制 MIME 附件?

如何在 Worklight 应用程序中创建 html 链接,以使用 mime 在设备中使用默认程序打开文件?

如何编写多部分 MIME 混合消息以在 Outlook 中正确显示

如何在 Mime php 中创建和附加带有电子邮件的 excel 文件

python内建模块:smtplib