# Java > Dveloppement Web en Java > Servlets/JSP >  Impossible de supprimer/fermer un fichier en cours d'utilisation par Java Platform SE binary

## Fuzo13

Plop !

J'ai un genre de drive o je peux uploader/downloader/visualiser des fichiers en ligne.

Mon problme survient lorsque que je tente de supprimer un fichier qui a dj t visualis sur mon site. Si je ne visualise pas le fichier je peux le supprimer.

Dans le cas o la suppression ne fonctionne pas je reoit une erreur:



> Unable to delete file: c:\Users\MyPC\chemindemonfichier\fichier.extension


Etant donn que je stocke les fichiers dans un dossier dont j'ai l'accs j'ai essay de le supprimer manuellement. Windows me donne l'erreur suivante (tant que mon servlet est lanc):


On voit bien que le fichier est encore ouvert dans ma servlet. Le problme c'est que j'utilise que java.io.File et org.springframework.web.multipart.MultipartFile pour manipuler mes fichiers. Dans les deux cas on n'a pas besoin de fermer/ouvrir le fichier puisqu'on ne manipule qu'une "image" de celui-ci. 




> org.springframework.web.multipart.MultipartFile
> 
> 
> A representation of an uploaded file received in a multipart request. 
> 
> The file contents are either stored in memory or temporarily on disk. In either case, the user is responsible for copying file contents to a session-level or persistent store as and if desired. The temporary storages will be cleared at the end of request processing.


Le seul endroit ou j'ouvre un inputstream est dans le cas d'un chargement de fichier sur mon serveur:


```

```

Le code de mon visualiseur de fichier:


```

```

Le code de suppression:


```

```

Aprs de longue recherche je ne vois pas bien o est-ce que je pourrais fermer le fichier...

Merci de votre aide  ::):

----------


## provirus

Bonjour,

un point qui n'aidera pas, mais qui est important, dans le try, vous fermez le fichier et dans le finally, vous le refermez. Laissez la fermeture uniquement dans le finally puisqu'il est toujours appel.

Ensuite, quand vous recevez un fichier, il est dans un MultipartFile et vous le copiez dans un endroit non temporaire. Quel est votre code de la copie? Peut-tre qu'il n'est pas bien ferm  cet endroit.

----------


## Fuzo13

Bonjour,

Merci pour votre rponse  ::): .




> un point qui n'aidera pas, mais qui est important, dans le try, vous fermez le fichier et dans le finally, vous le refermez. Laissez la fermeture uniquement dans le finally puisqu'il est toujours appel.


Effectivement lors de mes tests j'ai un peu tout essay et j'ai laisser mon close dans le try et le finally. 




> Ensuite, quand vous recevez un fichier, il est dans un MultipartFile et vous le copiez dans un endroit non temporaire. Quel est votre code de la copie? Peut-tre qu'il n'est pas bien ferm  cet endroit.


Je suppose que vous faites allusion   

```
IOUtils.copy(inputStream, response.getOutputStream());
```

 IOutils.copy proviens de org.apache.commons.io.IOutils.copy

EDIT:

Aprs rflexion j'ai oubli de fermer mon l'outputStrem j'ai donc ajouter ce code dans le finally:


```

```

Cependant cela ne rsout pas mon problme. Lorsque je visualise les fichiers, la fonction de download n'est pas appele et je ne peux quand mme pas supprimer le fichier.

----------


## provirus

> Je suppose que vous faites allusion   
> 
> ```
> IOUtils.copy(inputStream, response.getOutputStream());
> ```


non, a c'est la partie que vous envoyer un fichier ; pas la partie quand vous le recevez. (je parle de quand un utilisateur upload un fichier sur votre serveur et que vous utilisez le MultipartFile que vous avez dcris dans votre message initial.

----------


## Fuzo13

l'Upload ce fait uniquement avec les l'objet File donc pas besoin de le fermer normalement. Peut tre que je suis passe  ct de quelques chose...  ::): 



```

```

SmartFileUpload/process:


```

```

SmartFolderManager:


```

```

----------


## tchize_

C'est bien uniquement aprs un passage dans handleDonwloadFile que tu ne peux plus le supprimer? Et si tu ressaie quelques minutes plus tard tu peux l'effacer. InputStream.close() avait (je ne sais pas si c'est corrig depuis) la rputation de ne pas cloturer immdiatement les stream mais d'attendre un garbage collect.

Aussi, ceci



```

```

est dangereux, j'auras vite fais de tenter de tlcharger "../../management-users.xml" ou autre joyeuset assimile  ::):

----------


## Fuzo13

> C'est bien uniquement aprs un passage dans handleDonwloadFile que tu ne peux plus le supprimer? Et si tu ressaie quelques minutes plus tard tu peux l'effacer. InputStream.close() avait (je ne sais pas si c'est corrig depuis) la rputation de ne pas cloturer immdiatement les stream mais d'attendre un garbage collect.


C'est lorsque j'ai visualis le fichier que je ne peux plus le supprimer sinon aucun problme de suppression.




> Aussi, ceci
> 
> 
> 
> ```
> 
> ```
> 
> est dangereux, j'auras vite fais de tenter de tlcharger "../../management-users.xml" ou autre joyeuset assimile


Qu'est ce que vous suggrer pour ne pas avoir de problme de scurit ?

Peut tre quelques chose comme a:


```

```

pour ne pas avoir une variable contenant le chemin complet.

----------


## tchize_

> C'est lorsque j'ai visualis le fichier que je ne peux plus le supprimer sinon aucun problme de suppression.


Oui, mais concrtement la diffrence entre je peux supprimer et je ne peux pas supprimer est uniquement un passage par "handleDonwloadFile" ou il y a d'autres choses implique dans "visualiser le fichier" ? (filtres, process front end de slection de fichier, que sais-je)





> Qu'est ce que vous suggrer pour ne pas avoir de problme de scurit ?


En gnral, je stockerais le nom du fichier cr dans une db et je vrifierais que le fichier existe bien dans la db. 

Mme problme avec ton smartfileupload accessoirement, il utilise aveuglment le filename fournis par le browser, et tu auras de belles surprises avec opera qui va dire "le nom de fichier c'est c:\Users\tom\Documents and Settings\My Documents\facturation123.pdf". Quand tu sauve un fichier upload, donne lui un nom que tu choisi, pas celui que le browser choisi.




> Peut tre quelques chose comme a:
> 
> 
> ```
> 
> ```
> 
> pour ne pas avoir une variable contenant le chemin complet.


ca ne change strictement rien, je peux faire un new File("/chemin/vers/stockage/../../etc/passwd") a marchera.

----------


## Fuzo13

Le handleDownloadFile comme sont nom l'indique n'est appel que lorsqu'on essaye de tlcharger un fichier pas dans le cas d'une visualisation.
Le problme ici viens du fait qu'aprs une visualisation donc passage 

ici :


```

```

et ici:


```

```




> En gnral, je stockerais le nom du fichier cr dans une db et je vrifierais que le fichier existe bien dans la db. 
> 
> Mme problme avec ton smartfileupload accessoirement, il utilise aveuglment le filename fournis par le browser, et tu auras de belles surprises avec opera qui va dire "le nom de fichier c'est c:\Users\tom\Documents and Settings\My Documents\facturation123.pdf". Quand tu sauve un fichier upload, donne lui un nom que tu choisi, pas celui que le browser choisi.


Pour ce qui est du filename ce n'est pas le navigateur qui rcupre le nom de mes fichiers. Ils sont lists sur mon site pour permettre  l'utilisateur de les slectionner mais le chemin du dossier o ils sont enregistrs est dans ma base de donne.

----------

