Téléchargement de fichiers avec des servlets et des JSP

Téléchargement de fichiers avec Servlets et JSP

1. introduction

Dans ce rapide didacticiel, nous verrons comment importer un fichier à partir d'un servlet.

Pour ce faire, nous allons d'abord voir la solution Java EE vanille avec des capacités de téléchargement de fichiers fournies par l'annotation native@MultipartConfig.

Ensuite, nous passerons en revue la bibliothèque Apache CommonsFileUpload, pour les versions antérieures de l'API Servlet.

2. Utilisation de Java EE@MultipartConfig

À partir de la version 6, Java EE a la capacité de prendre en charge les téléchargements en plusieurs parties prêts à l'emploi.

En tant que tel, il s'agit probablement d'une solution par défaut lors de l'enrichissement d'une application Java EE avec la prise en charge du téléchargement de fichiers.

Tout d'abord, ajoutons un formulaire à notre fichier HTML:

Choose a file:

Le formulaire doit être défini à l'aide de l'attributenctype=”multipart/form-data” pour signaler un téléchargement en plusieurs parties.

Ensuite,we’ll want to annotate our HttpServlet with the correct information using the @MultipartConfig annotation:

@MultipartConfig(fileSizeThreshold = 1024 * 1024,
  maxFileSize = 1024 * 1024 * 5,
  maxRequestSize = 1024 * 1024 * 5 * 5)
public class MultipartServlet extends HttpServlet {
    //...
}

Assurez-vous ensuite que notre dossier de téléchargement par défaut sur le serveur est défini:

String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();

Enfin,we can easily retrieve our inbound File from the request using the getParts() method, et enregistrez-le sur le disque:

for (Part part : request.getParts()) {
    fileName = getFileName(part);
    part.write(uploadPath + File.separator + fileName);
}

Notez que, dans cet exemple, nous utilisons une méthode d'assistance getFileName ():

private String getFileName(Part part) {
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename"))
            return content.substring(content.indexOf("=") + 2, content.length() - 1);
        }
    return Constants.DEFAULT_FILENAME;
}

Pour Servlet 3.1. projets, nous pourrions également utiliser la méthodePart.getSubmittedFileName():

fileName = part.getSubmittedFileName();

3. Utilisation du fichier Apache Commons

Si nous ne sommes pas sur un projet Servlet 3.0, nous pouvons utiliser directement la bibliothèque Apache Commons FileUpload.

3.1. Installer

Nous souhaitons utiliser les dépendancespom.xml suivantes pour exécuter notre exemple:


    commons-fileupload
    commons-fileupload
    1.3.3


    commons-io
    commons-io
    2.6

Les versions les plus récentes peuvent être trouvées en effectuant une recherche rapide sur le dépôt central de Maven:commons-fileupload etcommons-io.

3.2. Télécharger le servlet

Les trois parties principales de l’incorporation de la bibliothèqueFileUpload d’Apache sont les suivantes:

  • Un formulaire de téléchargement dans une page.jsp.

  • Configuration de vos objetsDiskFileItemFactory etServletFileUpload.

  • Traitement du contenu réel d'un téléchargement de fichier en plusieurs parties.

Le formulaire de téléchargement est le même que celui de la section précédente.

Passons à la création de notre servlet Java EE.

Dans notre méthode de traitement des demandes, nous pouvons encapsuler lesHttpRequest entrants avec une vérification pour voir s'il s'agit d'un téléversement en plusieurs parties.

Nous spécifierons également les ressources à allouer temporairement au téléchargement du fichier (pendant son traitement) sur nosDiskFileItemFactory.

Enfin,we’ll create a ServletFileUpload object which will represent the actual file itself. Il exposera le contenu du téléchargement en plusieurs parties pour le serveur final de persistance:

if (ServletFileUpload.isMultipartContent(request)) {

    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(MEMORY_THRESHOLD);
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setFileSizeMax(MAX_FILE_SIZE);
    upload.setSizeMax(MAX_REQUEST_SIZE);
    String uploadPath = getServletContext().getRealPath("")
      + File.separator + UPLOAD_DIRECTORY;
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
        uploadDir.mkdir();
    }
    //...
}

Et puis, nous pouvons extraire ces contenus et les écrire sur le disque:

if (ServletFileUpload.isMultipartContent(request)) {
    //...
    List formItems = upload.parseRequest(request);
    if (formItems != null && formItems.size() > 0) {
        for (FileItem item : formItems) {
        if (!item.isFormField()) {
            String fileName = new File(item.getName()).getName();
            String filePath = uploadPath + File.separator + fileName;
                File storeFile = new File(filePath);
                item.write(storeFile);
                request.setAttribute("message", "File "
                  + fileName + " has uploaded successfully!");
        }
        }
    }
}

4. Exécuter l'exemple

Une fois que nous avons compilé notre projet dans un.war, nous pouvons le déposer dans notre instance Tomcat locale et le démarrer.

À partir de là, nous pouvons afficher la vue de mise en ligne principale dans laquelle un formulaire nous est présenté:

image

Après avoir téléchargé votre fichier avec succès, nous devrions voir le message:

image

Enfin, nous pouvons vérifier l’emplacement spécifié dans notre servlet:

image

5. Conclusion

C'est ça! Nous avons appris à fournir des téléchargements de fichiers en plusieurs parties à l'aide de Java EE, ainsi que de la bibliothèque CommonFileUpload d'Apache!

Des extraits de code, comme toujours, peuvent être trouvésover on GitHub.