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

1. Vue d'ensemble

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

Dans ce didacticiel, nous allons couvrir un exemple simple de création d'un fichier téléchargeable et de son service à partir d'une application Java Servlet .

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

2. Dépendances de Maven

Si vous utilisez Jakarta EE, nous n'aurons pas besoin d'ajouter de dépendances. 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ée ici.

3. Servlet

Jetons d'abord un coup d'œil au 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. Demande de point final

L'annotation @WebServlet («/ download») marque la classe DownloadServlet pour traiter les requêtes dirigées vers le point final «/ download» .

Vous pouvez également le faire en décrivant le mappage dans le fichier web.xml.

3.2. Type de contenu de réponse

L' objet HttpServletResponse a une méthode appelée setContentType que nous pouvons utiliser pour définir l'en - tête Content-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 appelons maintenant simplement la valeur le type de support.

Cette valeur peut être «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ée ici .

Pour notre exemple, nous utilisons un simple fichier texte. Le Content-Type pour un fichier texte est «text / plain».

3.3. Contenu de la réponse - Disposition

La définition de l'en - tête Content-Disposition dans l'objet de réponse indique au navigateur comment gérer le fichier auquel il accède.

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

Les valeurs Content-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é, le Content-Disposition par défaut est «inline».

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 donné et d'autres afficheront une boîte de dialogue de téléchargement contenant notre valeur prédéfinie.

L'action exacte prise dépendra du navigateur.

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

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

En utilisant HttpServletResponse # getOutputStream () , nous lisons ensuite à partir du flux d'entrée de la ressource et écrivons dans OutputStream 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 raisonnable à allouer pour transmettre les données de InputStream à OutputStream ; plus le noyau 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 continue jusqu'à ce que numByteRead soit égal à 0 car cela indique la fin du fichier.

3.5. Fermer et rincer

Les instances de flux doivent être fermées après utilisation pour libérer les ressources qu'elles détiennent actuellement. Les instances Writer doivent également être vidées pour écrire tous les octets restants en mémoire tampon vers sa destination.

À l'aide d'une instruction try-with-resources , l'application ferme automatiquement toute instance AutoCloseable définie dans le cadre de l' instruction try . Cliquez ici pour en savoir plus sur l'essai avec les ressources

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échargement du 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 média indiquent au navigateur client le 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ête Content-Disposition .

Tout le code de cet article se trouve à over over sur GitHub.