2017-08-28 103 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

相關問題