0

我使用 javamail api 从 java 应用程序发送带有附件的电子邮件,这很简单。

File f= new File(file);
MimeBodyPart mbp2 = new MimeBodyPart();

try {
    mbp2.attachFile(f);
} catch (IOException e) {
    e.printStackTrace();
}



Multipart mp= new MimeMultipart();
mp.addBodyPart(mbp2);

message.setContent(mp);

但我想知道的是如何知道我的附件的上传进度,不像httpclient我找不到要写入的输出流!谢谢!

4

2 回答 2

1

请参阅方法实现。

public void attachFile(File file) throws IOException, MessagingException {
    FileDataSource fds = new FileDataSource(file);      
    this.setDataHandler(new DataHandler(fds));
    this.setFileName(fds.getName());
}

您需要使用跟踪文件上传的自定义实现来覆盖 FileDataSource。

您应该重写 getInputStream() 方法以返回对读取字节进行计数的 FilterOutputStream。Apache commons-io 具有可以完成这项工作的CountingInputStream类。

然后,您只需将读取的字节数与文件长度进行比较即可获得进展。

于 2012-08-22T13:51:49.040 回答
0

好的,我通过覆盖 DataHandler() 做到了,它工作得非常好!

class progress extends DataHandler{
long len;
public idky(FileDataSource ds) {
    super(ds);
    len= ds.getFile().length();
    // TODO Auto-generated constructor stub
}



long transferredBytes=0;
public void writeTo(OutputStream os) throws IOException{

        InputStream instream = this.getInputStream();
        DecimalFormat dFormat = new DecimalFormat("0.00");

      byte[] tmp = new byte[4096];
      int l;
      while ((l = instream.read(tmp)) != -1)
      {
        os.write(tmp, 0, l);
        this.transferredBytes += l;
        System.out.println(dFormat.format(((double)transferredBytes/(double)this.len)*100)+"%");

      }
      os.flush();


}
}

并将其添加到 MimeBodyPart。

于 2012-08-22T17:25:42.743 回答