java - 如何使用 Apache 文件上传启用附件

标签 java jsp servlets file-upload jakarta-mail

我正在使用 Apache commons 文件上传 API 将文件从 JSP 存储到临时目录中的 servlet,但我不知道下一步应该做什么才能使用 javamail API 将电子邮件作为附件发送。

如何使用 Apache Fileupload API 检索写入临时目录中的文件,并将它们作为附件发送到邮件服务器。将这些文件写入内存或磁盘对我有何帮助?

最佳答案

这是一个例子:

private static void notify(String subject, String text,
        File attachment, String from, String to) throws Exception {
    Context context = new InitialContext();
    Session sess = (Session)context.lookup("java:comp/env/mail/session");
    MimeMessage message = new MimeMessage(sess);
    message.setSubject(subject, "UTF-8");
    if (attachment == null) {
        message.setText(text, "UTF-8");
    } else {
        MimeMultipart mp = null;
        MimeBodyPart part1 = new MimeBodyPart();
        part1.setText(text, "UTF-8");
        MimeBodyPart part2 = new MimeBodyPart();
        part2.setDataHandler(new DataHandler(new FileDataSource(attachement)));
        part2.setFileName(file.getName());
        mp = new MimeMultipart();
        mp.addBodyPart(part1);
        mp.addBodyPart(part2);
        message.setContent(mp);
   }

    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    Transport.send(message);
}

在此示例中,使用了 FileDataSource,这意味着附件必须首先保存为文件。 我有时会使用自制的 MemoryDataSource 来代替。这是代码:

package com.lagalerie.mail;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataSource;

public class MemoryDataSource implements DataSource {
    private String name;
    private String contentType;
    private byte content[] = {};

    public MemoryDataSource(String name, String contentType) {
        this.name = name;
        this.contentType = contentType;
    }

    public String getContentType() {
        return contentType;
    }

    public InputStream getInputStream() {
        return new ByteArrayInputStream(content);
    }

    public String getName() {
        return name;
    }

    public OutputStream getOutputStream() {
        return new ByteArrayOutputStream() {
            @Override
            public void close() {
                content = toByteArray();
            }
        };
    }
}

关于java - 如何使用 Apache 文件上传启用附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704103/

相关文章:

java - 如何通过jsp页面中的超链接打开本地保存在Windows服务器上的pdf?

java - jsp session 更新数量

Java Servlet getInputStream 错误

java - ML Kit Vision - 使用内存图像中的camerax进行条形码检测会导致由于 'int android.graphics.Bitmap.getWidth()'而导致空指针异常

java - 如何仅在特定 Controller 中定义的路径上启用 Java Spring 安全性?

java - 如何在发送到使用该读取器的方法之前解析 Java 中的读取器

jsp - 提交Struts 2表单而不改变页面?

java - 在java中扩充工厂模式

servlets - Servlet 3.0 异步支持不起作用

jsp - Tomcat 提供另一个 URL