`
feiniao2029
  • 浏览: 21494 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用JavaMail、jspsmartupload在客户端发送附件

    博客分类:
  • mail
阅读更多

OpenCms6.0.0本身已具有MailForm结构化类型用于网站在线发送邮件,可是在表单项中没有FILE,无法发送其它文件类型的附件,必须修改MailForm结构化类型,并重新去编译org.opencms.frontend.templateone.form中的内容。由于使用JavaMail来发送邮件是很简单的事,而且我本身也有已经写好的邮件发送类,只需要加入邮件附件发送的功能即可,因此决定自行编写新的类来发送邮件及其附件。

如果你用Google或是Baidu可以从网上搜到大片的使用JavaMail发送邮件及附件的例子和文章,皆由JavaMail本身的一个例子而来,此例子中先使用MimeMultipart  multi来创建一个信体(这是要发附件所必须的),然后使用MimeBodyPart mbp1 、MimeBodyPart mbp2 来分别创建多个信体内容,文本的信体内容直接使用mbp1.setText(msgText1),而要加文件附件则使用mbp2.setDataHandler(),DataHandler只按受DataSource、Object String和URL类型,例子中直接使用FileDataSource fds =new FileDataSource(filename)来创建一个DataSource,然后使用mbp2.setDataHandler(new DataHandler(fds))将这个附件放进去。filename来自本地的文件名,本身必须存在,所以它是无法使用客户端的文件名来创建的,因此看到网上有好多人使用此例子后才发现在客户端上传的文件报错无法发送附件(那是当然了,有的例子中Form中的数据都没封装,只是取得客户端的文件名去创建当然找不到文件抛出异常了)。

解决办法之一:在客户端发送邮件提交文件附件时,先上传此文件到服务器,这样才能使用上传后得到的路径和文件名来创建DataSource发送文件附件,而使用FILE表单项必须使用ENCTYPE="multipart/form-data"来封装数据,这样使用request.getParameter就无法获得表单其它选项的值了。所幸有jspsmartupload这个上传组件,它将表单中封装的数据转换成了byte[]类型,然后进行截取,将文件上传后使用myUpload.getRequest().getParameter("formname")即可获得所需要的表单提交后的值,这样虽然解决了问题,但是所发送的邮件附件文件并不是我所需要保存的,而且在上传时还进行了一次磁盘写的操作,对性能也有影响,那么为何不在文件上传读到内存中直接来创建呢,请看我的第二个解决方法。

解决方法之二:使用jspsmartupload组件将文件上传后直接取得文件流来创建DataSource。本身FileDataSource并不支持从InputStream来创建DataSource,所以我们需要编写一个新的FileDataSource,在网上已经有ByteArrayDataSource.java文件,它支持以InputStream、byte[]和String来创建DataSource,使用ByteArrayDataSource fds  =  new  ByteArrayDataSource(files,"application/octet-stream");我们即可使用InputStream、byte[]和String来创建DataSource发送文件附件。不幸的是我们无法直接使用jspsmartupload组件来取得上传文件的stream,jspsmartupload组件的文档中只有getContentString返回文件内容的String,如果附件是纯文本文件用此String来创建DataSource发送附件没有问题的,可是文件类型如果是其它格式,如Word、图片或压缩包,则文件无法使用了,另一个getBinaryData返回的是byte类型,需要循环读出,无奈之下只有反编译jspsmartupload中的File.class,在其中新加了返回InputStream,代码如下:

public InputStream getBinValue (){
InputStream ip =new DataInputStream(new ByteArrayInputStream(m_parent.m_binArray, m_startData,m_size));
return ip;

这样我们创建InputStream,使用myUpload.getFiles().getFile(0).getBinValue();获得上传文件的Stream来创建DataSource发送邮件附件,然后再关闭它。

以上两种方法均可解决在客户端发送邮件附件的问题,大家可自行取舍。

 

原文地址:http://www.maxuan.com/opencms/article/archive/200709/20070918.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics