2017-08-28 57 views
2

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

停止做'file.delete()'当它不存在。你有没有检查过'file.canRead()'?它输出什么? – pedromss

+0

我添加了“file.delete()”,试图解决这个问题。它会在没有它的情况下抛出相同的错误。 – Samarland

+0

我不知道为什么人们放弃选票,当我真的看到这是一个问题,而不是一个简单的! – Samarland

回答

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(); 
      } 
     } 
    } 
}; 
+0

谢谢! @pedromss帮助我确定第一个问题,并帮助我解决清理问题!多谢你们俩! – Samarland

相关问题