IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

download & setContentType


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de r1-1024
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 138
    Par défaut download & setContentType
    Bonjour à tous,

    J'essaye de coder un transfert de fichier dans un servlet de la façon suivant :
    -J'ai un répertoire qui ne se trouve pas dans les ressources du servlet : /serverData
    -Le servlet détecte une demande de fichier qd l'url est de la forme : http://ip/servlet/file/filename
    -Le fichier renvoyé se trouve dans /serverData/filename

    C pas très compliqué il suffit de copier le fichier dans le ServletOutputStream. On trouve un exemple ici : http://java.developpez.com/faq/javae...GEMENT_FICHIER

    Mais mon pb c'est le type mime du fichier à mettre dans response.setContentType() car je n'ai pas envie que le fichier soit téléchargé mais interprété dans le navigateur.

  2. #2
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut
    Bonjour,

    Pour du texte formaté il faut que tu utilses la classe PrintWriter
    PrintWriter out = response.getWriter();
    et non
    ServletOutputStream out = response.getOutputStream();
    valable pour l'envoi d'un flot de données

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le contentType doit être, par exemple
    text/html
    text/plain
    etc

    (tu trouvera des liste un peu partout, nottement sur wikipedia)


    Pour éviter le téléchargement, tu dois aussi mettre
    Content-Disposition: inline

    pour des document style pdf / doc, ca peux inciter le browser à l'afficher dans le navigateur, mais sans garantie. le RFC ne force rien

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pour récupérer le type mime correspondant à ton fichier, tu peux utiliser ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     String mime = request.getSession().getServletContext().getMimeType(filePath);
     response.setContentType(mime);
    Il faudrait tester "mime", dans certains cas, il ne trouve pas de correspondance. Ceci dit, ça ne pose pas plus de problème que ça s'il est "null"

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé Avatar de r1-1024
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 138
    Par défaut
    Merci à tous pour vos réponses.
    J'ai donc pu m'inspirer des sources Tomcat (cf org/apache/catalina/servlets/DefaultServlet.java)

    -response.setHeader("Content-Disposition", "inline"); systématique
    -si contentType= getServletContext().getMimeType(filename) est null ou text ou xml j'utilise le writer
    -sinon j'utilise le ServletOutputStream

    Voilà mon code.
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
     
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.PrintWriter;
     
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    public class FileServlet extends HttpServlet implements GlobalData
    {
    	private void copyFile(File file,HttpServletResponse response, 
    			String contentType) throws IOException
    	{
    		ServletOutputStream ostream = null;
            PrintWriter writer = null;
     
    		response.setContentLength((int) file.length());
     
    		try 
    		{
    			if ((contentType==null) || (contentType.startsWith("text")) 
    					|| (contentType.endsWith("xml")) )
    			{
                    writer = response.getWriter();
    				copy(file, writer);
    			}
    			else
    			{
    				ostream = response.getOutputStream();
    				response.setContentType(contentType);
    				copy(file, ostream);
    			}
    		} 
    		finally
    		{
    			if(ostream!=null)
    			{
    				try {ostream.close();} 
    				catch (IOException e) {}
    			}
     
    			if(writer!=null)
    			{
    				writer.close();
    			}
    		}
     
    	}
     
    	private void copy(File file,ServletOutputStream ostream) throws IOException
    	{
     
    		FileInputStream fin=null;
    		BufferedInputStream in=null;
    		int bufferSize = 64 * 1024;
     
    		try
    		{
    			fin=new FileInputStream(file);
    			in=new BufferedInputStream(fin);
    			byte[] bufferBytes = new byte[bufferSize];
    			int len;
    			while((len = in.read(bufferBytes)) > 0)
    				ostream.write(bufferBytes, 0, len);
    			ostream.flush();
    		}
    		finally
    		{
    			if(in!=null)
    			{
    				try {in.close();} 
    				catch (IOException e) {}
    			}
    			if(fin!=null)
    			{
    				try {fin.close();} 
    				catch (IOException e) {}
    			}
    		}
     
    	}
     
    	private void copy(File file,PrintWriter writer) throws IOException
    	{
    		FileReader freader=null;
    		BufferedReader reader=null;
    		int bufferSize = 64 * 1024;
    		try
    		{
    			freader=new FileReader(file);
    			reader=new BufferedReader(freader);
    			char[] bufferBytes = new char[bufferSize];
    			int len;
    			while((len = reader.read(bufferBytes)) > 0)
    				writer.write(bufferBytes, 0, len);
    			writer.flush();
    		}
    		finally
    		{
    			if(reader!=null)
    			{
    				try {reader.close();} 
    				catch (IOException e) {}
    			}
    			if(freader!=null)
    			{
    				try {freader.close();} 
    				catch (IOException e) {}
    			}
    		}
    	}
     
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
        {
        	//get the requested file
        	String filename=request.getPathInfo();
        	File file = null;
     
        	if((filename!=null) && (file=new File(repository,filename)).exists() && file.isFile())
        	{
        		response.setHeader("Content-Disposition", "inline");
        		String contentType= getServletContext().getMimeType(filename);
     
        		copyFile(file, response,contentType);
        	}
        	else
        	{
     
        		response.sendError(HttpServletResponse.SC_NOT_FOUND,
        				request.getRequestURI());
        	}
        } 
    }
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [servlet][api][download] Où trouver la lib servlet.jar ?
    Par cpr0 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 03/02/2004, 21h07
  2. Idhttp et vitesse de download ?
    Par slashi dans le forum Web & réseau
    Réponses: 4
    Dernier message: 23/11/2003, 20h48
  3. [download] que me faut-il ??
    Par terziann dans le forum Débuter
    Réponses: 2
    Dernier message: 03/07/2003, 15h58
  4. [Kylix] [Kylix] download
    Par jean christophe dans le forum EDI
    Réponses: 2
    Dernier message: 10/12/2002, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo