javamail 读取较大附件

灰太狼11111 2010-03-16 03:56:22
用的事james服务器,mysql数据库,上传小点的附件倒没有什么事,但是如果附件较大的话,读取邮件的速度会很慢,我的理解是因为邮件的内容和附件都存放在BLOB里面的,要获取附件的名称,就必须先获取BLOB里面的内容,在这里是getContent(),所以如果附件很大的话,就要将几M的内容从数据库中取出,再显示到前台,有没有更好的方法让读取较大的附件让速度变快
下面是我的部分代码,这里我只想去附件的名称,点击下载的时候才下载
Multipart mp = (Multipart) message.getContent();

List<String> attachName = new ArrayList<String>();// 用来存放附件名称,因为不知道附件有多少个
// 所以用list
List<Long> attachSize = new ArrayList<Long>();// 用来存放附件大小kb

for (int j = 0, m = mp.getCount(); j < m; j++) {
Part attachPart = mp.getBodyPart(j);
String disposition = attachPart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(attachPart.ATTACHMENT)) || (disposition
.equals(attachPart.INLINE)))) {

long chunk = attachPart.getSize();// 获得附件的大小,不一定很准确。
attachSize.add(chunk);
String s = new String(attachPart.getFileName().getBytes(
"iso-8859-1"), "utf-8");
// MimeUtility.decodeText(attachPart.getFileName());
attachName.add(MimeUtility.decodeText(s));
}
}
// }
String[] an = new String[attachName.size()];
long[] size = new long[attachSize.size()];
for (int i = 0; i < an.length; i++) {
an[i] = attachName.get(i);
size[i] = attachSize.get(i);
}
eform.setAttachName(an);
eform.setFileSize(size);
if (an.length > 0)
eform.setContainAttach(true);
...全文
429 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyman564 2010-10-15
  • 打赏
  • 举报
回复
不是getContent()的问题,是getBodyText的问题,当getBodyText时,它会自动从服务器上面把内容全部取下来,然后再取参数中第i个部分,所以就慢了,这个暂时我也没找到更好的解决方法。。。
WJPIAO 2010-04-28
  • 打赏
  • 举报
回复
如果附件的扩展名不是txt的时候,就是请求头是text/*的时候,就不会读取全部内容,当然这里的全部是包含附件的。
这样就可以在客户端下载附件的时候再去读取附件,

我的问题是附件的下载速度很慢,当然附件我没有存到硬盘上,而是直接从邮件里面获得inputStream流写道文件里,但是速度和从文件到文件的复制差很多,不知道为什么
灰太狼11111 2010-03-18
  • 打赏
  • 举报
回复
我已经是这样做的啦,只获取名称,又没有下载,就是获取附件名称的时候也要读取邮件内容,会很慢
villagehead 2010-03-16
  • 打赏
  • 举报
回复
"只想去附件的名称,点击下载的时候才下载"
这样就很好啊,
用名字生成一个url,放到<a>里面,然后用户要下载的时候再去点击下载。

这样不行吗?

good luck
nickycheng 2010-03-16
  • 打赏
  • 举报
回复
收邮件的时候可以单独获取邮件头信息,里面却没有包含附件信息。正文中包含附件及附件名称,但我们翻开邮件的源码,会发现是下面这样,

--=====001_Dragon200423071335_=====
Content-Type: multipart/related;
boundary="=====002_Dragon200423071335_=====";
type="multipart/alternative"

--=====002_Dragon200423071335_=====
Content-Type: multipart/alternative;
boundary="=====003_Dragon200423071335_====="


--=====003_Dragon200423071335_=====
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: base64

INK2sK67qqOsxPq6ww0KDQoxoaK49867tcRWU1PIqM/e0tG+rb+qzagNClZTU7/io7pcXDE5Mi4x
NjguMTAuM1zKtc+wyfoNCtPDu6fD+6O6uPfX1NDVw/u1xMa0.
。。。

其实就是一个个的部分顺序排列,并没有什么索引,如何能取巧获取到名字而不去读取内容?

这样看来似乎没什么办法可以不读取正文信息而获取附件内容。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧