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:
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é):Unable to delete file: c:\Users\MyPC\chemindemonfichier\fichier.extension
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.
Le seul endroit ou j'ouvre un inputstream est dans le cas d'un chargement de fichier sur mon serveur: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 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
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 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
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>
Après de longue recherche je ne vois pas bien où est-ce que je pourrais fermer le 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 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()); }
Merci de votre aide
Partager