Exemple de téléchargement de fichier dans une servlet

Exemple de téléchargement de fichier dans une servlet

 1. Vue d'ensemble

Une caractéristique commune des applications Web est la possibilité de télécharger des fichiers.

Dans ce didacticiel,we’ll cover a simple example of creating a downloadable file and serving it from a Java Servlet application.

Le fichier que nous utilisons proviendra des ressources de l'application Web.

2. Dépendances Maven

If using Java EE, then we wouldn’t need to add any dependencies. Cependant, si nous utilisons Java SE, nous aurons besoin de la dépendance javax.servlet-api:


    javax.servlet
    javax.servlet-api
    4.0.1
    provided

La dernière version de la dépendance peut être trouvéehere.

3. Servlet

Examinons d'abord le code, puis découvrons ce qui se passe:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    private final int ARBITARY_SIZE = 1048;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

        resp.setContentType("text/plain");
        resp.setHeader("Content-disposition", "attachment; filename=sample.txt");

        try(InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/sample.txt");
          OutputStream out = resp.getOutputStream()) {

            byte[] buffer = new byte[ARBITARY_SIZE];

            int numBytesRead;
            while ((numBytesRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, numBytesRead);
            }
        }
    }
}

3.1. Demander le point final

L'annotation@WebServlet(“/download”) marque la classeDownloadServlet pour traiter les demandes dirigées vers le point d'envoi“/download” .

Alternativement, nous pouvons le faire en décrivant le mappage dans le fichier web.xml.

3.2. RéponseContent-Type

L'objetHttpServletResponse a une méthode appeléesetContentType que nous pouvons utiliser pour définir l'en-têteContent-Type de la réponse HTTP.

Content-Type est le nom historique de la propriété d'en-tête. Un autre nom était le type MIME (Multipurpose Internet Mail Extensions). Nous nous référons maintenant simplement à la valeur en tant que type de support.

This value could be “application/pdf”, “text/plain”, “text/html”, “image/jpg”, etc., la liste officielle est maintenue par l'Internet Assigned Numbers Authority (IANA) et peut être trouvéehere.

Pour notre exemple, nous utilisons un simple fichier texte. The Content-Type for a text file is “text/plain”.

3.3. RéponseContent-Disposition

La définition du sheaderContent-Disposition dans l'objet de réponse indique au navigateur comment gérer le fichier auquel il accède.

Les navigateurs comprennent l'utilisation deContent-Disposition comme une convention, mais cela ne fait pas réellement partie de la norme HTTP. W3 a un mémo sur l'utilisation deContent-Disposition disponible pour lirehere.

Les valeursContent-Disposition pour le corps principal d'une réponse seront soit «en ligne» (pour le contenu de la page Web à rendre) ou «pièce jointe» (pour un fichier téléchargeable).

S'il n'est pas spécifié, leContent-Disposition par défaut est «en ligne».

En utilisant un paramètre d’en-tête facultatif, nous pouvons spécifier le nom de fichier «sample.txt».

Certains navigateurs téléchargeront immédiatement le fichier en utilisant le nom de fichier spécifié et d'autres afficheront une boîte de dialogue de téléchargement contenant notre valeur prédéfinie.

L'action exacte à prendre dépend du navigateur.

3.4. Lecture à partir d'un fichier et écriture dans un flux de sortie

Dans les lignes de code restantes, nous prenons lesServletContext de la requête, et l'utilisons pour obtenir le fichier dans «/WEB-INF/sample.txt».

En utilisantHttpServletResponse #getOutputStream(), nous lisons ensuite dans le flux d'entrée de la ressource et écrivons dans lesOutputStream de la réponse.

La taille du tableau d'octets que nous utilisons est arbitraire. Nous pouvons décider de la taille en fonction de la quantité de mémoire qu'il est raisonnable d'allouer pour transmettre les données desInputStream auxOutputStream; plus le nuber est petit, plus il y a de boucles; plus le nombre est élevé, plus l'utilisation de la mémoire est élevée.

Ce cycle se poursuit jusqu'à ce quenumByteRead soit égal à 0, car cela indique la fin du fichier.

3.5. Fermer et rincer

Les instances deStream doivent être fermées après utilisation pour libérer les ressources qu'elle détient actuellement. Les instances deWriter doivent également être vidées pour écrire tous les octets restants en mémoire tampon vers sa destination.

À l'aide d'une instructiontry-with-resources, l'applicationclose automatiquement toute instanceAutoCloseable définie dans le cadre de l'instructiontry. En savoir plus sur try-with-resourceshere.

Nous utilisons ces deux méthodes pour libérer de la mémoire, en nous assurant que les données que nous avons préparées sont envoyées depuis notre application.

3.6. Télécharger le fichier

Avec tout en place, nous sommes maintenant prêts à exécuter notre Servlet.

Maintenant, lorsque nous visitons le point final relatif“/download”, notre navigateur tentera de télécharger le fichier en tant que «simple.txt».

4. Conclusion

Le téléchargement d'un fichier à partir d'un Servlet devient un processus simple. L'utilisation de flux nous permet de transmettre les données sous forme d'octets et les types de support informent le navigateur client du type de données à attendre.

C'est au navigateur de déterminer comment gérer la réponse, cependant, nous pouvons donner quelques directives avec l'en-têteContent-Disposition.

Tout le code de cet article se trouve surover on GitHub.