Télécharger un ficher
mlotfi2
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je veux télécharger un fichier, avec un pop-up qui permet de définir l'emplacement du fichier que je veux télécharger.
J'ai utilisé ce code mais l'image que je télécharge est Vide :/
y-t-il quelqu'un qui peux m'aider ?
à noter que j'utilise JSF 2
Je veux télécharger un fichier, avec un pop-up qui permet de définir l'emplacement du fichier que je veux télécharger.
J'ai utilisé ce code mais l'image que je télécharge est Vide :/
y-t-il quelqu'un qui peux m'aider ?
public void download(String chemin) throws IOException { File file = new File(chemin); InputStream fis = new FileInputStream(file); byte[] buf = new byte[1024]; int offset = 0; int numRead = 0; while ((offset < buf.length) && ((numRead = fis.read(buf, offset, buf.length -offset)) != -1)) { offset += numRead; } fis.close(); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setContentType("image/png"); response.setHeader("Content-Disposition", "attachment;filename=instructions.png"); System.err.println(buf.toString() + " "+buf.length); response.getOutputStream().write(buf); response.getOutputStream().flush(); response.getOutputStream().close(); FacesContext.getCurrentInstance().responseComplete(); }
à noter que j'utilise JSF 2
A voir également:
- Télécharger un ficher
- Télécharger clavier arabe - Télécharger - Divers Web & Internet
- Telecharger word 2013 - Télécharger - Traitement de texte
- Telecharger ccleaner - Télécharger - Nettoyage
- Télécharger instagram pc - Télécharger - Divers Communication
- Telecharger - Télécharger - Compression & Décompression
1 réponse
Bonjour,
Tu as fait, un buf.toString(), or buf est un byte[] ça ne fera pas du tout ce que tu veux.
On pourrait éventuellement faire un new String(buf); mais dans ton cas tu manipules des données binaires (une image), donc la convertir en texte n'a pas beaucoup de sens, et pourrait entraîner des problèmes d'encodage inutiles.
Ta lecture de ton fichier est fausse aussi, je ne sais pas exactement ce que tu as voulu faire avec ton offset, mais comme tu l'as fait, la lecture de ton fichier ne pourra être stocké que dans ton buffer, et sera donc limité à ses 1024 octets, alors qu'une image peut-être bien plus grandes.
Dans tous les cas il vaudrait mieux passer directement de ton InputStream vers le OutputStream de la réponse, ça évite des manipulations inutiles.
Tu as fait, un buf.toString(), or buf est un byte[] ça ne fera pas du tout ce que tu veux.
byte[] buf = new byte[1024]; String str = buf.toString(); System.out.println(str); // [B@13579bdf
On pourrait éventuellement faire un new String(buf); mais dans ton cas tu manipules des données binaires (une image), donc la convertir en texte n'a pas beaucoup de sens, et pourrait entraîner des problèmes d'encodage inutiles.
Ta lecture de ton fichier est fausse aussi, je ne sais pas exactement ce que tu as voulu faire avec ton offset, mais comme tu l'as fait, la lecture de ton fichier ne pourra être stocké que dans ton buffer, et sera donc limité à ses 1024 octets, alors qu'une image peut-être bien plus grandes.
Dans tous les cas il vaudrait mieux passer directement de ton InputStream vers le OutputStream de la réponse, ça évite des manipulations inutiles.
public void download(String chemin) throws IOException { HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setContentType("image/png"); response.setHeader("Content-Disposition", "attachment;filename=instructions.png"); byte[] buf = new byte[1024]; InputStream in = new FileInputStream(chemin); OutputStream out = response.getOutputStream(); int len; while ((len = in.read(buf)) != -1) out.write(buf, 0, len); in.close(); FacesContext.getCurrentInstance().responseComplete(); }