gpt4 book ai didi

Java:使用 Oreilly MultipartRequest servlet 发送带有附件的电子邮件

转载 作者:行者123 更新时间:2023-11-30 06:59:38 25 4
gpt4 key购买 nike

我正在使用Oreilly MultipartRequest servlet解析表单 multipart/form-data 请求:

String path = getServletContext().getRealPath("/tmp");
List uploadFiles = new ArrayList();
MultipartRequest multi = new MultipartRequest(request, path, 50 * 1024 * 1024, "UTF-8");
Enumeration<String> params = multi.getParameterNames();
Enumeration<String> files = multi.getFileNames();
//retrieve text parameters
String param;
while(params .hasMoreElements()){
param = params .nextElement();
for(String occurence : multi.getParameterValues(param)){
pageContext.setAttribute(param, occurence);
}
}
//get files
String fileParam;
while(files.hasMoreElements()){
fileParam = files.nextElement();
uploadFiles.add(multi.getFile(fileParam));
}

我能够获取所有数据,但对于文件,我想将它们作为附件发送,通常这样做(通过解析请求)

        ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
try {
List fileItemsList = servletFileUpload.parseRequest(request);
Iterator it = fileItemsList.iterator();
while (it.hasNext()){
FileItem fileItem = (FileItem)it.next();
if (fileItem.isFormField()){
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileItem.getString());
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileItem.getFieldName());
multipart.addBodyPart(messageBodyPart);
}
}
} catch(Exception e) {
out.println(e.toString());
}

相反,我正在创建要上传的所有文件 uploadFiles 的列表。问题是附件使用 FileItem接口(interface),它允许我使用 getString() 以字符串形式获取文件项的内容,而 Oreilly MultipartRequest 仅将文件返回为 File目的。如何类似地使用 File 对象的内容,或者将其转换为 FileItem 对象。

最佳答案

根据文档,FileItem.getString() 返回“文件项的内容作为字符串”。但是 FileDataSource(String) “从指定的路径名​​创建 FileDataSource”。因此,在第二个代码片段中,您将文件内容作为字符串传递(谁知道对二进制文件会做什么)而不是文件名。 getFieldName() 将返回表单字段的名称,而不是上传文件的名称(这就是您想要的)。

如果您使用 MultipartRequest 处理上传,那么从 MultipartRequest 返回的 File 对象实例化 DataHandler 所需的 FileDataSource 就很简单了。

如果您使用 ServletFileUpload 处理上传,那么最好的方法可能是创建您自己的 DataSource 接口(interface)的自定义实现,该实现允许在构造函数中使用 FileItem

public class FileItemDataSource implements DataSource {

private FileItem item;

public FileItemDataSource(FileItem item) {
this.item = item;
}

@Override
public String getContentType() {
return item.getContentType() ;
}

@Override
public InputStream getInputStream() throws IOException {
return item.getInputStream();
}

@Override
public String getName() {
return item.getName();
}

@Override
public OutputStream getOutputStream() throws IOException {
return item.getOutputStream();
}
}

有了这样的类(class),你就可以做到

DataSource source = new FileItemDataSource(fileItem);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileItem.getName());
multipart.addBodyPart(messageBodyPart);

关于Java:使用 Oreilly MultipartRequest servlet 发送带有附件的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41160703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com