2017-08-28 1 views
2

Meine Webanwendung wurde auf Spring MVC erstellt. Ich habe eine Methode, wo der Benutzer PDFs hochladen kann. Die Ich sende die Datei als mutlipart Datei an den Server. Jedes Mal, wenn der Benutzer hochlädt.Zieldatei existiert bereits und konnte beim Hochladen nicht gelöscht werden

Alles, was ich will, ist, die Dateien als Anlagen in dieser E-Mail zu senden. Mein Code

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; 
    } 

Aufruf der Methode, die Anlage zu bereiten:

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); 

Erste Ausnahme:

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/:?] 

dies perfekt funktionieren, wenn ich die zweite Datei hinzufügen Kommentar aus :(

message.addAttachment(form.getFile2().getOriginalFilename(), file2); 

irgendwelche beraten?

+1

Stopp tun 'File.Delete()', wenn es nicht existiert. Hast du das 'file.canRead()' überprüft? Was gibt es aus? – pedromss

+0

Ich habe "file.delete()" hinzugefügt, um das Problem zu beheben. Es wird den gleichen Fehler ohne es werfen. – Samarland

+0

Ich weiß nicht, warum Leute die Abstimmung ablehnen, wenn ich wirklich sehe, dass dies ein Problem ist und nicht einfach! – Samarland

Antwort

1

Im Allgemeinen sollten Sie Ihren Benutzern nicht erlauben, den Pfad einer Datei zu bestimmen, die Sie auf Ihrem Server erstellen - dies führt zu einer Menge Sicherheitslücken. In diesem Fall versuchen sie möglicherweise, eine temporäre Datei zu erstellen, die dieselbe Nummer hat wie eine andere Datei in Ihrem temporären Verzeichnis, möglicherweise eines, das nichts mit Ihrer aktuellen Anwendung zu tun hat. File.createTempFile stellt sicher, dass bei jedem Aufruf eine Datei mit einem eindeutigen Namen erstellt wird.

Es ist auch eine gute Übung, temporäre Dateien zu bereinigen, sobald Sie fertig sind, damit Sie sich nicht darum kümmern müssen, den Status auf Ihrem Server zwischen Methodenaufrufen zu verwalten. Dies kann manchmal Code erstellen, der ein bisschen besetzt ist mit catch/schließlich blockiert, aber es ist es wert zu vermeiden, um 3 Uhr auf einer Festplatte, die voll von Müll temporäre Dateien ist aufwachen.

Ich würde implementieren diese in etwa so:

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

Danke! @pedroms hilft mir, die erste Ausgabe zu finden, und Sie haben mir geholfen, das Aufräumen zu lösen! Danke für euch beide! – Samarland

Verwandte Themen