目标文件已存在,上载时无法删除

时间:2017-08-28 20:47:09

标签: java file multipart

我的网络应用程序是在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);

任何建议?

1 个答案:

答案 0 :(得分:1)

通常,您不应该让用户确定您在服务器上创建的文件的路径 - 它会引入许多安全漏洞。在这种情况下,他们可能正在尝试创建一个临时文件,该文件与临时目录中的其他文件相同,可能与当前应用程序无关。 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();
            }
        }
    }
};