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


Comment puis-je télécharger des fichiers sur le serveur en utilisant 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 n'obtiens que le nom du fichier, pas le contenu du fichier. Lorsque j'ajoute enctype="multipart/form-data" au <form>, alors request.getParameter() renvoie null.

Pendant la recherche, 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 lancé une exception sans message et cause clairs. 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)
Author: Taryn, 2010-03-11

14 answers

Introduction

Pour parcourir et sélectionner un fichier à télécharger, vous avez besoin d'un champ HTML <input type="file"> dans le formulaire. Comme indiqué dans la spécification HTML , vous devez utiliser la méthode POST et l'attribut enctype 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 de formulaire en plusieurs parties binaires sont disponibles dans le corps de la requête dans un format différent que lorsque le enctype n'est pas défini.

Avant la Servlet 3.0, l'API de Servlet ne en charge en mode natif multipart/form-data. Il ne prend en charge que le type de formulaire par défaut de application/x-www-form-urlencoded. Les request.getParameter() et consorts renverraient tous null lors de l'utilisation de données de formulaire en plusieurs parties. C'est là que le bien connu Apache Commons FileUpload est entré dans l'image.

Ne l'analysez pas manuellement!

, Vous pouvez, en théorie, d'analyser le corps de la requête en fonction de ServletRequest#getInputStream(). Cependant, il s'agit d'un travail précis et fastidieux qui nécessite une connaissance précise de RFC2388. Vous ne devriez pas essayer pour ce faire sur votre propre ou copypaste un code sans bibliothèque homegrown trouvé ailleurs sur Internet. De nombreuses sources en ligne ont échoué dans ce domaine, telles que roseindia.net. Voir aussité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 depuis 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.), alors vous pouvez simplement utiliser l'API standard fournie HttpServletRequest#getPart() pour collecter les éléments de données de formulaire en plusieurs parties individuels (la plupart des implémentations de Servlet 3.0 utilisent en fait Apache Commons FileUpload sous les couvertures pour cela!). De plus, les champs de formulaire normaux sont disponibles par getParameter() de la manière habituelle.

Première annoter votre servlet avec @MultipartConfig afin de pouvoir reconnaître et de soutenir multipart/form-data demandes et d'obtenir ainsi getPart() travailler:

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

Alors, mettre en œuvre 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(). Ceci est un correctif MSIE quant à l'obtention du nom de fichier. Ce navigateur envoie incorrectement le chemin complet du fichier le long du nom au lieu du seul nom du fichier.

Dans le cas où vous avez un <input type="file" name="file" multiple="true" /> pour le téléchargement multi-fichiers, collectez-les comme ci-dessous (malheureusement, il n'y a 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 le Servlet 3.1, obtenez manuellement le nom de fichier soumis

Notez que Part#getSubmittedFileName() a été introduit dans le Servlet 3.1 (Tomcat 8, Quai 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 pour obtenir le nom du fichier. Ce navigateur envoie incorrectement le chemin complet du fichier le long du nom au lieu du seul nom du 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 la mise à niveau?), la pratique courante consiste à utiliser Apache Commons FileUpload pour analyser les demandes de données de formulaire multpart. Il a un excellent Guide de l'utilisateur et 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 pendant des années. Je ne vous recommande pas de l'utiliser. Apache Commons FileUpload est toujours activement maintenu et actuellement très mature.

Afin de utilisez Apache Commons FileUpload, vous devez avoir au moins les fichiers suivants dans votre application web /WEB-INF/lib:

Votre tentative initiale a probablement échoué parce que vous avez oublié le commons IO.

Voici un exemple de coup d'envoi à quoi le doPost() de votre UploadServlet peut ressembler lors de l'utilisation d'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 n'appelez pas getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), etc. sur la même demande préalable. Sinon, le conteneur de servlet lira et analysera le corps de la requête et Apache Commons FileUpload obtiendra donc un corps de requête vide. Voir aussi a. o. ServletFileUpload#parseRequest(request) renvoie une liste vide .

Notez le FilenameUtils#getName(). Ceci est un correctif MSIE quant à l'obtention du nom de fichier. Ce navigateur envoie incorrectement le chemin complet du fichier le long du nom au lieu du seul nom du fichier.

Alternativement, vous pouvez également envelopper ceci le tout dans un Filter qui analyse tout automatiquement et remet les choses dans le parametermap de la demande afin que vous puissiez continuer à utiliser request.getParameter() de 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() retournant toujours null

Notez que les versions Glassfish plus anciennes que 3.1.2 avaientun bug dans lequel le getParameter() renvoie toujours null. Si vous ciblez un tel conteneur et ne peut pas le mettre à niveau, alors vous devez extraire la valeur de 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">

Sauvegarde du fichier téléchargé (n'utilisez pas getRealPath() ni part.write()!)

Dirigez-vous vers les réponses suivantes pour plus de détails sur l'enregistrement correct du InputStream obtenu (la variable fileContent comme indiqué dans les extraits de code ci-dessus) sur le disque ou la base de données:

Servir le fichier téléchargé

Dirigez-vous vers les réponses suivantes pour plus de détails sur la remise correcte du fichier enregistré à partir du disque ou de la base de données au client:

Ajaxifier la forme

Dirigez-vous vers les réponses suivantes comment télécharger en utilisant Ajax (et 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 changé, 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 aide:)

 1214
Author: BalusC, 2019-12-18 16:11:40

Si vous utilisez Spring MVC, voici comment: (Je laisse ceci ici au cas où quelqu'un le trouverait utile).

Utilisez un formulaire avec l'attribut enctype 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, mapper le paramètre de requête file à MultipartFile type 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 MultipartFile's getOriginalFilename() et getSize().

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

 26
Author: Amila, 2015-08-26 12:39:53

Sans composant ou d'une Bibliothèque externe dans Tomcat 6 o 7

Activation du téléchargement dans le Web.fichier 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 LE 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. Fichiers:

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 JSP ou Servlet

    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();

Modifier votre code de la servlet exigences, comme max-taille de fichier, max-demande-taille et d'autres options que vous pouvez définir...

 12
Author: joseluisbz, 2014-01-25 05:44:54

Vous avez besoin que le fichier common-io.1.4.jar soit inclus dans votre répertoire lib, 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 fichier common.io.jaril suffit de le google ou simplement d'aller sur le site Web Apache Tomcat où vous obtenez l'option pour un téléchargement gratuit de ce fichier. Mais rappelez-vous une chose: téléchargez le fichier ZIP binaire si vous êtes un utilisateur Windows.

 11
Author: Pranav, 2012-11-03 12:25:19

J'utilise un Servlet commun pour chaque formulaire Html, qu'il ait des pièces jointes ou non. Ce servlet renvoie un TreeMap où les clés sont des paramètres de nom jsp et les valeurs sont des entrées utilisateur et enregistre toutes les pièces jointes dans le répertoire fixe et plus tard vous renommez le répertoire de votre choix.Ici Connections est notre interface personnalisée ayant un objet de connexion. Je pense que cela 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;
    }
}
 9
Author: feel good and programming, 2013-07-09 22:39:41

Pour Spring MVC J'ai essayé pendant des heures de le faire et a réussi à avoir une version plus simple qui a fonctionné pour prendre une entrée de forme à la fois des données et des 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:)

 8
Author: Shivangi Gupta, 2017-07-15 19:42:10

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 commons-io et commons-fileupload, le problème provient d'un chargeur de classe parent gérant les jars commons-xxx. Ce qui doit être évité. L'accident s'est toujours produit à:

fileItems = uploader.parseRequest(request);

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

J'ai ajouté le code source pour commons-fileupload et commons-io dans mon projet Eclipse pour retracer l'erreur réelle et enfin avoir 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 piégées). Deuxièmement, le message d'erreur est obscurcissant en ce sens qu'il indique class not found 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 Geronimo sous-répertoire du référentiel dans le cadre d'une installation standard.

Enfin, j'ai trouvé 1 endroit qui a posé une solution de travail qui a résolu avec succès 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 montré 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>
 6
Author: Geoffrey Malafsky, 2013-09-10 15:15:52

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
Author: thouliha, 2015-05-21 16:49:16

Vous devez d'abord définir l'attribut enctype du formulaire sur "multipart / form-data"

Ceci est illustré ci-dessous.

<form action="Controller" method="post" enctype="multipart/form-data">
     <label class="file-upload"> Click here to upload an Image </label>
     <input type="file" name="file" id="file" required> 
</form>

Puis, dans le Servlet "Controller", ajoutez l'annotation pour un Multi-part pour indiquer que les données multipart sont traitées dans le servlet.

Après cela, récupérez la partie envoyée via le formulaire, puis récupérez le nom du fichier (avec le chemin)du fichier soumis. Utilisez ceci pour créer un nouveau fichier dans le chemin souhaité et écrire les parties du fichier dans le nouveau fichier créé pour recréer le fichier.

Comme indiqué ci-dessous:

@MultipartConfig

public class Controller extends HttpServlet {

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

    private void addProduct(HttpServletRequest request, HttpServletResponse response) {
        Part filePart = request.getPart("file");
        String imageName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

        String imageSavePath = "specify image path to save image"; //path to save image
        FileOutputStream outputStream = null;
        InputStream fileContent = null;

        try {
            outputStream = new FileOutputStream(new File(imageSavePath + File.separator + imageName));
            //creating a new file with file path and the file name
            fileContent = filePart.getInputStream();
            //getting the input stream
            int readBytes = 0;
            byte[] readArray = new byte[1024];
            //initializing a byte array with size 1024

            while ((readBytes = fileContent.read(readArray)) != -1) {
                outputStream.write(readArray, 0, readBytes);
            }//this loop will write the contents of the byte array unitl the end to the output stream
        } catch (Exception ex) {
            System.out.println("Error Writing File: " + ex);
        } finally {
            if (outputStream != null) {
                outputStream.close();
                //closing the output stream
            }
            if (fileContent != null) {
                fileContent.close();
                //clocsing the input stream
            }
        }
    }
}
 0
Author: Lakindu Hewawasam, 2020-11-24 10:49:02

Vous pouvez télécharger le fichier en utilisant jsp /servlet.

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

D'autre part 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
Author: Mitul Maheshwari, 2014-02-04 10:00:31
DiskFileUpload upload=new DiskFileUpload();

À partir 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);
 -1
Author: Mahender Reddy Yasa, 2018-09-07 22:28:44

Le moyen le plus simple pourrait être trouvé pour les fichiers et les contrôles d'entrée, avec 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
Author: access_granted, 2020-04-26 06:13:52

, Envoi de plusieurs fichiers pour fichier, nous devons utiliser enctype="multipart/form-data"
et pour envoyer plusieurs fichiers, utilisez 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
Author: rohan kamat, 2014-01-27 04:33:38

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 DE 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

Compiler ci-dessus servlet UploadServlet et créer l'entrée requise dans le web.fichier 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>
 -2
Author: Himanshu Patel, 2016-07-15 13:28:57