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:
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>
L'action correspondante:
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;
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).
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
 response.setHeader("Content-Disposition", "attachment;filename=Documentation"+ f.getFile_doc_ext());
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 -.-


Si quelqu'un a une idée :3