Comment télécharger des fichiers sur le serveur en utilisant JSP / Servlet?


688

Comment puis-je télécharger des fichiers sur le serveur à l'aide de JSP / Servlet? J'ai essayé ceci:

<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

Cependant, je ne reçois que le nom du fichier, pas le contenu du fichier. Lorsque j'ajoute enctype="multipart/form-data"à la <form>, puis request.getParameter()revient null.

Pendant les recherches, je suis tombé sur Apache Common FileUpload . J'ai essayé ceci:

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

Malheureusement, le servlet a levé une exception sans message clair ni cause. Voici le stacktrace:

SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)

Peut-être que cet article sera utile: baeldung.com/upload-file-servlet
Adam Gerard

Réponses:


1193

introduction

Pour parcourir et sélectionner un fichier à télécharger, vous avez besoin d'un <input type="file">champ HTML dans le formulaire. Comme indiqué dans la spécification HTML, vous devez utiliser la POSTméthode et l' enctypeattribut du formulaire doit être défini sur "multipart/form-data".

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

Après avoir soumis un tel formulaire, les données du formulaire binaire en plusieurs parties sont disponibles dans le corps de la demande dans un format différent de celui qui enctypen'est pas défini.

Avant Servlet 3.0, l'API Servlet ne supportait pas nativement multipart/form-data. Il prend uniquement en charge le type de formulaire par défaut de application/x-www-form-urlencoded. Les request.getParameter()consorts et retourneraient tous nulllors de l'utilisation de données de formulaire en plusieurs parties. C'est là que le fameux Apache Commons FileUpload est entré en scène.

Ne pas analyser manuellement!

Vous pouvez en théorie analyser vous-même le corps de la demande ServletRequest#getInputStream(). Cependant, c'est un travail précis et fastidieux qui nécessite une connaissance précise de la RFC2388 . Vous ne devriez pas essayer de le faire par vous-même ou copopastez du code local sans bibliothèque trouvé ailleurs sur Internet. De nombreuses sources en ligne ont échoué dans ce domaine, comme roseindia.net. Voir aussi téléchargement du fichier pdf . Vous devriez plutôt utiliser une vraie bibliothèque qui est utilisée (et implicitement testée!) Par des millions d'utilisateurs pendant des années. Une telle bibliothèque a prouvé sa robustesse.

Lorsque vous êtes déjà sur Servlet 3.0 ou plus récent, utilisez l'API native

Si vous utilisez au moins Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, etc.), vous pouvez simplement utiliser l'API standard fournie HttpServletRequest#getPart()pour collecter les éléments de données de formulaire multiparties individuels (la plupart des implémentations Servlet 3.0 utilisent réellement Apache Commons FileUpload sous les couvertures pour cela!). De plus, les champs de formulaire normaux sont disponibles de getParameter()la manière habituelle.

Annotez d'abord votre servlet avec @MultipartConfigafin de lui permettre de reconnaître et d'accompagner les multipart/form-datarequêtes et ainsi getPart()de travailler:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

Ensuite, implémentez son doPost()comme suit:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

Notez le Path#getFileName(). Il s'agit d'un correctif MSIE quant à l'obtention du nom de fichier. Ce navigateur envoie de façon incorrecte le chemin d'accès complet au fichier au lieu du seul nom de fichier.

Dans le cas où vous avez un <input type="file" name="file" multiple="true" />téléchargement multi-fichiers, collectez-les comme ci-dessous (malheureusement, il n'existe pas de méthode telle que request.getParts("file")):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

Lorsque vous n'êtes pas encore sur Servlet 3.1, obtenez manuellement le nom du fichier soumis

Notez que cela a Part#getSubmittedFileName()été introduit dans Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, etc.). Si vous n'êtes pas encore sur Servlet 3.1, vous avez besoin d'une méthode utilitaire supplémentaire pour obtenir le nom du fichier soumis.

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

Notez le correctif MSIE quant à l'obtention du nom de fichier. Ce navigateur envoie de façon incorrecte le chemin d'accès complet au fichier au lieu du seul nom de fichier.

Lorsque vous n'êtes pas encore sur Servlet 3.0, utilisez Apache Commons FileUpload

Si vous n'êtes pas encore sur Servlet 3.0 (n'est-il pas temps de mettre à niveau?), La pratique courante consiste à utiliser Apache Commons FileUpload pour analyser les demandes de données de formulaire en plusieurs parties. Il a un excellent guide de l'utilisateur et une FAQ (parcourez attentivement les deux). Il y a aussi le O'Reilly (" cos ") MultipartRequest, mais il a quelques bugs (mineurs) et n'est plus activement maintenu depuis des années. Je ne recommanderais pas de l'utiliser. Apache Commons FileUpload est toujours activement maintenu et actuellement très mature.

Pour utiliser Apache Commons FileUpload, vous devez avoir au moins les fichiers suivants dans votre application Web /WEB-INF/lib:

Votre tentative initiale a échoué très probablement parce que vous avez oublié l'IO commun.

Voici un exemple de lancement à quoi pourrait ressembler doPost()votre UploadServletlorsque vous utilisez Apache Commons FileUpload:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

Il est très important que vous ne l' appelez getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), etc sur la même demande au préalable. Sinon, le conteneur de servlet lira et analysera le corps de la requête et donc Apache Commons FileUpload obtiendra un corps de requête vide. Voir aussi ao ServletFileUpload # parseRequest (request) renvoie une liste vide .

Notez le FilenameUtils#getName(). Il s'agit d'un correctif MSIE quant à l'obtention du nom de fichier. Ce navigateur envoie de façon incorrecte le chemin d'accès complet au fichier au lieu du seul nom de fichier.

Alternativement, vous pouvez également envelopper tout cela dans un Filterqui les analyse tous automatiquement et remettre les choses dans le parametermap de la demande afin que vous puissiez continuer à utiliser request.getParameter()la manière habituelle et récupérer le fichier téléchargé par request.getAttribute(). Vous pouvez trouver un exemple dans cet article de blog .

Solution de contournement pour le bug GlassFish3 de getParameter()retournull

Notez que les versions de Glassfish antérieures à 3.1.2 avaient un bug dans lequel le getParameter()retourne toujours null. Si vous ciblez un tel conteneur et ne pouvez pas le mettre à niveau, vous devez extraire la valeur getPart()à l'aide de cette méthode utilitaire:

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

Enregistrement du fichier téléchargé (ne pas utiliser getRealPath()ni part.write()!)

Consultez les réponses suivantes pour plus de détails sur l'enregistrement correct de la copie obtenue InputStream(la fileContentvariable indiquée dans les extraits de code ci-dessus) sur le disque ou la base de données:

Servir le fichier téléchargé

Consultez les réponses suivantes pour plus de détails sur la manière de bien servir le fichier enregistré du disque ou de la base de données au client:

Ajaxification du formulaire

Consultez les réponses suivantes pour télécharger à l'aide d'Ajax (et de jQuery). Notez que le code de servlet pour collecter les données du formulaire n'a pas besoin d'être modifié pour cela! Seule la façon dont vous répondez peut être modifiée, mais c'est plutôt trivial (c'est-à-dire qu'au lieu de transférer vers JSP, imprimez simplement du JSON ou du XML ou même du texte brut en fonction de ce que le script responsable de l'appel Ajax attend).


J'espère que tout cela vous aidera :)


Ah désolé, je voyais request.getParts("file")et j'étais confus x_x
Kagami Sascha Rosylight

Avec Servlet 3.0, si une MultipartConfigcondition est violée (par exemple maxFileSize:), l'appel request.getParameter()renvoie null. Est-ce exprès? Que faire si j'obtiens des paramètres (texte) normaux avant d'appeler getPart(et de rechercher un IllegalStateException)? Cela provoque un NullPointerExceptionjet avant que je ne puisse vérifier le IllegalStateException.
theyuv

@BalusC J'ai créé un article à ce sujet, avez-vous une idée de la façon de récupérer des informations supplémentaires à partir de File API webKitDirectory. Plus de détails ici stackoverflow.com/questions/45419598/…
Rapster

Si vous n'êtes pas sur Servlet 3.0 et utilisez l'astuce FileUpload, j'ai constaté que vous ne pouvez pas lire le fichier de la demande plus d'une fois. Si vous avez besoin de cette fonctionnalité, vous voudrez peut-être regarder MultiPartFilter de Spring. Ce message a un bon exemple de travail: stackoverflow.com/a/21448087/1048376
splashout

1
Oui, si quelqu'un essaie d'utiliser le code dans la section 3.0 avec tomcat 7, il pourrait rencontrer un problème en String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.partie similaire à moi
raviraja

26

S'il vous arrive d'utiliser Spring MVC, voici comment: (Je laisse cela ici au cas où quelqu'un le trouverait utile).

Utilisez un formulaire dont l' enctypeattribut est défini sur " multipart/form-data" (identique à la réponse de BalusC)

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

Dans votre contrôleur, mappez le paramètre de demande fileà MultipartFiletaper comme suit:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

Vous pouvez obtenir le nom et la taille du fichier en utilisant MultipartFileles touches getOriginalFilename()et getSize().

J'ai testé cela avec la version Spring 4.1.1.RELEASE.


Si je ne me trompe pas, cela nécessite que vous configuriez un bean dans la configuration de l'application de votre serveur ...
Kenny Worden

11

Vous avez besoin que le common-io.1.4.jarfichier soit inclus dans votre librépertoire, ou si vous travaillez dans n'importe quel éditeur, comme NetBeans, alors vous devez aller dans les propriétés du projet et ajouter simplement le fichier JAR et vous aurez terminé.

Pour obtenir le common.io.jarfichier, il suffit de le rechercher sur Google ou simplement de visiter le site Web Apache Tomcat où vous avez la possibilité de télécharger gratuitement ce fichier. Mais souvenez-vous d'une chose: téléchargez le fichier ZIP binaire si vous êtes un utilisateur Windows.


Impossible de trouver .jarmais .zip. Tu veux dire .zip?
Malwinder Singh

10

Sans composant ni bibliothèque externe dans Tomcat 6 o 7

Activation du téléchargement dans le fichier web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Enabling%20File%20Uploads .

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

COMME VOUS POUVEZ VOIR :

    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

Téléchargement de fichiers à l'aide de JSP. Des dossiers:

Dans le fichier html

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

Dans le fichier ou le servlet JSP

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

Modifiez votre code en fonction des exigences de la servlet, comme max-file-size , max-request-size et d'autres options que vous pouvez définir ...


9

J'utilise un servlet commun pour chaque formulaire HTML, qu'il comporte des pièces jointes ou non. Cette servlet retourne un TreeMapoù les clés sont le nom jsp Les paramètres et les valeurs sont des entrées utilisateur et enregistre toutes les pièces jointes dans un répertoire fixe et plus tard vous renommez le répertoire de votre choix. Voici les connexions est notre interface personnalisée ayant un objet de connexion. Je crois que ceci vous aidera

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}

@buhake sindi hey quel devrait être le chemin du fichier si j'utilise un serveur en direct ou que je vis mon projet en téléchargeant des fichiers sur le serveur
AmanS

2
N'importe quel répertoire dans live server.Si vous écrivez un code pour créer un répertoire dans servlet, alors le répertoire sera créé dans live srver
sentir bien et programmer

8

Pour Spring MVC, j'essaie depuis des heures de le faire et j'ai réussi à avoir une version plus simple qui fonctionnait pour la saisie sous forme de données et d'images.

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

Contrôleur à gérer

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

J'espère que cela aide :)


Pouvez-vous s'il vous plaît partager sélectionner la forme d'image db mysql et l'afficher sur jsp / html?
Ved Prakash

6

Une autre source de ce problème se produit si vous utilisez Geronimo avec son Tomcat intégré. Dans ce cas, après de nombreuses itérations de test de commons-io et commons-fileupload, le problème provient d'un chargeur de classe parent qui gère les pots communs-xxx. Cela doit être évité. L'accident s'est toujours produit à:

fileItems = uploader.parseRequest(request);

Notez que le type List de fileItems a changé avec la version actuelle de commons-fileupload pour être spécifiquement List<FileItem>par opposition aux versions précédentes où il était générique List.

J'ai ajouté le code source de commons-fileupload et commons-io dans mon projet Eclipse pour tracer l'erreur réelle et j'ai finalement obtenu un aperçu. Tout d'abord, l'exception levée est de type Throwable, pas l'exception FileIOException indiquée ni même l'exception (celles-ci ne seront pas interceptées). Deuxièmement, le message d'erreur est obscur en ce qu'il indique la classe non trouvée car axis2 n'a pas pu trouver commons-io. Axis2 n'est pas du tout utilisé dans mon projet mais existe en tant que dossier dans le sous-répertoire du référentiel Geronimo dans le cadre de l'installation standard.

Enfin, j'ai trouvé 1 endroit qui a posé une solution de travail qui a réussi à résoudre mon problème. Vous devez masquer les fichiers jar du chargeur parent dans le plan de déploiement. Cela a été mis dans geronimo-web.xml avec mon fichier complet ci-dessous.

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

0

Voici un exemple utilisant apache commons-fileupload:

// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
  "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);

0

Le moyen le plus simple pourrait être trouvé pour les fichiers et les contrôles d'entrée, sans un milliard de bibliothèques:

  <%
  if (request.getContentType()==null) return;
  // for input type=text controls
  String v_Text = 
  (new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();    

  // for input type=file controls
  InputStream inStr = request.getPart("File1").getInputStream();
  char charArray[] = new char[inStr.available()];
  new InputStreamReader(inStr).read(charArray);
  String contents = new String(charArray);
  %>

-1

vous pouvez télécharger un fichier à l'aide de jsp / servlet.

<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

côté serveur. utilisez le code suivant.

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}

-1
DiskFileUpload upload=new DiskFileUpload();

De cet objet, vous devez obtenir des éléments de fichier et des champs, puis vous pouvez stocker dans le serveur comme suit:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);

-2

Envoyer plusieurs fichiers pour le fichier que nous devons utiliser enctype="multipart/form-data"
et envoyer plusieurs fichiers multiple="multiple"dans la balise d'entrée

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>

2
Comment procéder pour obtenir getPart ("fileattachments") afin d'obtenir un tableau de Parts à la place? Je ne pense pas que getPart pour plusieurs fichiers fonctionnera?
CyberMew

-2

PAGE HTML

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

FICHIER SERVLET

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

Compilez le servlet UploadServlet ci-dessus et créez l'entrée requise dans le fichier web.xml comme suit.

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.