我的Web应用程序是在Spring MVC上制作的。我有一种用户可以上传PDF的方法
。
我正在将文件作为mutlipart文件发送到服务器。每次用户上传。
我想要的只是将文件作为附件发送到该电子邮件中。
我的密码
private File prepareAttachment(final MultipartFile mFile) {
File file = new File(System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + mFile.getOriginalFilename());
try {
if(file.exists()) {
file.delete();
}
mFile.transferTo(file);
} catch (FileNotFoundException fnfE) {
file.delete();
LOG.error(" file was not found.", fnfE);
} catch (IOException ioE) {
file.delete();
LOG.error("file has failed to upload.", ioE);
}
return file;
}
调用准备附件的方法:
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(final MimeMessage mimeMessage) throws Exception {
File file = prepareAttachment(form.getFile());
File file2 = prepareAttachment(form.getFile2());
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
message.addAttachment(form.getFile().getOriginalFilename(), file);
message.addAttachment(form.getFile2().getOriginalFilename(), file2);
获取异常:
2017-08-28 15:10:59,549 ERROR com.menards.requestForms.business.service.EmailService - file has failed to upload.
java.io.IOException: Destination file [C:\opt\tcserver\main\temp] already exists and could not be deleted
at org.springframework.web.multipart.commons.CommonsMultipartFile.transferTo(CommonsMultipartFile.java:160) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at com.menards.requestForms.business.service.EmailService.prepareAttachment(EmailService.java:552) ~[classes/:?]
如果我注释掉添加第二个文件,这将完美地工作:(
message.addAttachment(form.getFile2().getOriginalFilename(), file2);
有什么建议吗?
最佳答案
通常,您不应该让用户确定要在服务器上创建的文件的路径-它引入了很多安全漏洞。在这种情况下,他们可能正在尝试创建一个与temp目录中其他文件相同的临时文件,这可能与当前应用程序无关。 File.createTempFile
确保在每次调用时创建一个具有唯一名称的文件。
在完成临时文件清理后,这也是一个好习惯,因此您不必担心在方法调用之间维护服务器上的状态。有时这可能会创建一些忙于catch / finally块的代码,但值得避免在凌晨3点醒来一个充满垃圾临时文件的硬盘。
我大致将其实现为:
private File prepareAttachment(final MultipartFile mFile) throws IOException {
File tmp = null;
try {
tmp = File.createTempFile("upload", ".tmp");
mFile.transferTo(tmp);
return tmp;
} catch (IOException ioE) {
if (tmp != null) {
tmp.delete();
}
LOG.error("file has failed to upload.", ioE);
throw ioE;
}
}
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(final MimeMessage mimeMessage) throws Exception {
File file1 = null;
File file2 = null;
try {
file1 = prepareAttachment(form.getFile());
file2 = prepareAttachment(form.getFile2());
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
message.addAttachment(form.getFile().getOriginalFilename(), file1);
message.addAttachment(form.getFile2().getOriginalFilename(), file2);
// do your other stuff
} catch (IOException e) {
// some sort of error-handling, probably returning a message with an error status
} finally {
if (file1 != null) {
file1.delete();
}
if (file2 != null) {
file2.delete();
}
}
}
};