Bonjour,
j'ai un petit soucis pour la réception d'un fichier stocké en base (en Blob) pour un utilisateur.
Je me suis servi de la FAQ "Comment ouvrir un fichier dans le navigateur avec Struts?" et voici ce que j'ai fais :
JSP:
L'action correspondante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <c:if test="${!empty files.file_doc}"> <html:link page="/viewFile.do?id=${files.file_codeId}&file=doc" target="_blank" > Voir la documentation </html:link> </c:if>
Donc en gros dans l'action, je récupère un objet de type Files qui contient mon champs file_doc (blob) et file_doc_ext (l'extension du fichier correspondant aux données du blob).
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
35 Integer codeId = Integer.parseInt(request.getParameter("id")); String file = request.getParameter("file"); IFiles IFiles = new FilesDAO(); Files f = IFiles.getFilesById(codeId); if (file.equals("doc")) { logger.info("Récupération de la documentation"); ByteArrayOutputStream bos = new ByteArrayOutputStream(5000); try { InputStream in = f.getFile_doc().getBinaryStream(); int bytesRead = 0; while ((bytesRead = in.read()) != -1) { bos.write(bytesRead); } logger.debug("Extension en base: " + f.getFile_doc_ext()); logger.debug("Type MIME: " + GlobalVars.p.getProperty("ext" + f.getFile_doc_ext())); response.setContentType(GlobalVars.p.getProperty("ext" + f.getFile_doc_ext())); response.setContentLength(bos.size()); OutputStream os = response.getOutputStream(); os.write(bos.toByteArray(), 0, bos.size()); os.flush(); os.close(); in.close(); } catch (SQLException e) { logger.error("Erreur lors de la capture du flux du blob" + e); } } ... return null;
Je fais le traitement nécéssaire comme dans la FAQ en gérant les types MIME de manière automatique, bref, tout ça fonctionne niquel.
Quand l'utilisateur clique sur le lien "Voir la documentation" ça lui ouvre bien une fenetre avec le fichier.
LE probleme était que si l'utilisateur faisait clic droit enregistrer sous, on lui proposait bien d'enregistrer le fichier mais avec un nom du type viewFile.do (le nom de l'action du html:link donc).
J'ai donc rajouté ceci à mon action :
Ok ça marche, mais maintenant meme quand je clique normalement sur le lien, ça me propose de l'enregistrer et ça n'ouvre plus une nouvelle fenêtre -.-
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 response.setHeader("Content-Disposition", "attachment;filename=Documentation"+ f.getFile_doc_ext());
Si quelqu'un a une idée :3
Partager