Plop !

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

Mon problème survient lorsque que je tente de supprimer un fichier qui a déjà é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 reçoit 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'accès j'ai essayé de le supprimer manuellement. Windows me donne l'erreur suivante (tant que mon servlet est lancé):
Nom : scree.png
Affichages : 2461
Taille : 7,1 Ko

On voit bien que le fichier est encore ouvert dans ma servlet. Le problème 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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
	@RequestMapping(value="/downloadFile", method = RequestMethod.POST)
	public void  handleDonwloadFile(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redir)
	{
		Authentication 		auth = SecurityContextHolder.getContext().getAuthentication();
		String 				name = auth.getName();
		User 				user = service.getUsersFromLogins(name);
		String				fileName = request.getParameter("dlfilename");
		InputStream			inputStream = null;
 
		try 
		{
	        String filePathToBeServed = user.getUsr_folderpath()+"/"+request.getParameter("dlfilename");
	        File fileToDownload = new File(filePathToBeServed);
	        inputStream = new FileInputStream(fileToDownload);
	        response.setContentType("application/force-download");
	        response.setHeader("Content-Disposition", "attachment; filename="+fileName); 
	        IOUtils.copy(inputStream, response.getOutputStream());
	        response.flushBuffer();
	        inputStream.close();
	    } 
		catch (Exception e)
		{System.out.println("[BillingController]:HandleDownloadFile: "
				+ "Request could not be completed at this moment. Please try again.");}
		finally 
		{ 
			if (inputStream != null)
			{
				try 
				{ inputStream.close(); } 
				catch (IOException e) 
				{ System.out.println("[BillingController]:HandleDownloadFile: Failed to close streams"); }
			}
		}
	}
Le code de mon visualiseur de fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
							<c:choose>
									<c:when test="${fileExtension == 'application/vnd.ms-excel'}">
										<object data="rootfolder/<sec:authentication property="principal.username" />/${fileName}"
											type="${fileExtension}" width="100%" style="height:50em">
										</object>
									</c:when>
									<c:when test="${fileExtension == 'application/pdf'}">
										<object data="rootfolder/<sec:authentication property="principal.username" />/${fileName}" 
											type="${fileExtension}" width="100%" style="height:50em"> 
										</object>
									</c:when>
									<c:when test="${(fileExtension == 'image/png') ||  (fileExtension == 'image/jpg')}">
										<img src="rootfolder/<sec:authentication property="principal.username" />/${fileName}" width="100%" style="height:50em"/>
									</c:when>
									<c:otherwise>
										<div class="alert alert-danger" role="alert">
											<span class="glyphicon glyphicon-warning-sign" aria-hidden="true"></span>
				                			<spring:message code="billing.message.error.notsupported"/>
				            			</div>
									</c:otherwise>
								</c:choose>
Le code de suppression:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
		Authentication 		auth = SecurityContextHolder.getContext().getAuthentication();
		String 				name = auth.getName();
		User 				user = service.getUsersFromLogins(name);
		String				fileName = request.getParameter("deletefilename");
		File 				folder;
 
 
    	File file = new File(user.getUsr_folderpath()+"/"+fileName);
    	try {
			org.apache.commons.io.FileDeleteStrategy.FORCE.delete(file);
    		redir.addFlashAttribute("deleteSucced", message.getMessage("billing.message.success.delete", 
					new String[]{file.getName()}, Locale.getDefault()));
		} catch (IOException e) {
    		redir.addFlashAttribute("deleteFailed", message.getMessage("billing.message.error.delete", 
			new String[]{file.getName()}, Locale.getDefault()));
    		System.out.println(e.getMessage());
		}
Après de longue recherche je ne vois pas bien où est-ce que je pourrais fermer le fichier...

Merci de votre aide