2017-08-28 5 views
2

Mon application Web est créée sur Spring MVC. J'ai une méthode où l'utilisateur peut télécharger des fichiers PDF . J'envoie le fichier en tant que fichier mutlipart au serveur. Chaque fois que l'utilisateur télécharge.Le fichier de destination existe déjà et n'a pas pu être supprimé lors du téléchargement

Tout ce que je veux, c'est envoyer les fichiers en pièces jointes dans cet email. Mon 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; 
    } 

appelant la méthode pour préparer la pièce jointe:

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

exception Obtenir:

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

cela fonctionnera parfaitement si je commente en ajoutant le second fichier :(

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

un conseil?

+1

Arrêtez de faire 'File.Delete()' quand il n'existe pas. Avez-vous vérifié que 'file.canRead()'? Que sort-il? – pedromss

+0

J'ai ajouté le "file.delete()" en essayant de résoudre le problème. il va lancer la même erreur sans cela. – Samarland

+0

Je ne sais pas pourquoi les gens donnent le vote, quand je vois vraiment que c'est un problème et pas facile !! – Samarland

Répondre

1

Généralement, vous ne devez pas laisser vos utilisateurs déterminer le chemin d'accès d'un fichier que vous créez sur votre serveur, car il présente de nombreuses failles de sécurité. Dans ce cas, ils tentent peut-être de créer un fichier temporaire qui a la même valeur que un autre fichier dans votre répertoire temporaire, potentiellement celui qui n'a rien à voir avec votre application actuelle. File.createTempFile s'assure qu'il crée un fichier avec un nom unique à chaque invocation.

Il est également recommandé de nettoyer les fichiers temporaires dès que vous en avez terminé avec eux. Vous n'avez donc pas à vous soucier de la conservation de l'état sur votre serveur entre les appels de méthode. Cela peut parfois créer un code occupé avec des blocs catch/finally, mais ça vaut le coup d'éviter de se réveiller à 3 heures du matin sur un disque dur plein de fichiers temporaires.

je aimerais mettre en œuvre ce que à peu près:

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

Merci! @pedromss m'aide à comprendre le premier numéro et vous m'a aidé à résoudre le nettoyage! merci pour vous deux! – Samarland