Télécharger un ficher

Fermé
mlotfi2 Messages postés 12 Date d'inscription mardi 3 juin 2014 Statut Membre Dernière intervention 5 décembre 2014 - 19 juin 2014 à 14:05
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 19 juin 2014 à 19:26
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 ?

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:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
19 juin 2014 à 19:26
Bonjour,

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();
}
0