Come caricare file sul server usando JSP / Servlet?


687

Come posso caricare file sul server usando JSP / Servlet? Ho provato questo:

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

Tuttavia, ottengo solo il nome del file, non il contenuto del file. Quando aggiungo enctype="multipart/form-data"a <form>, quindi request.getParameter()ritorna null.

Durante la ricerca mi sono imbattuto in Apache Common FileUpload . Ho provato questo:

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

Sfortunatamente, il servlet ha lanciato un'eccezione senza un messaggio chiaro e una causa. Ecco lo 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)

Forse questo articolo sarà utile: baeldung.com/upload-file-servlet
Adam Gerard

Risposte:


1193

introduzione

Per sfogliare e selezionare un file per il caricamento è necessario un <input type="file">campo HTML nel modulo. Come indicato nella specifica HTML, è necessario utilizzare il POSTmetodo e l' enctypeattributo del modulo deve essere impostato su "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>

Dopo aver inviato tale modulo, i dati binari del modulo multipart sono disponibili nel corpo della richiesta in un formato diverso rispetto a quando enctypenon è impostato.

Prima di Servlet 3.0, l'API Servlet non supportava in modo nativo multipart/form-data. Supporta solo il tipo di modulo predefinito di application/x-www-form-urlencoded. I request.getParameter()consorti andrebbero tutti restituiti nullquando si utilizzano dati di moduli multipart. È qui che è apparso il noto FileUpload di Apache Commons .

Non analizzarlo manualmente!

In teoria puoi analizzare te stesso il corpo della richiesta in base ServletRequest#getInputStream(). Tuttavia, questo è un lavoro preciso e noioso che richiede una conoscenza precisa di RFC2388 . Non dovresti provare a farlo da solo o copiare un codice privo di librerie di casa trovato altrove su Internet. Molte fonti online hanno fallito duramente in questo, come roseindia.net. Vedi anche il caricamento di file pdf . Dovresti piuttosto usare una vera libreria che viene utilizzata (e implicitamente testata!) Da milioni di utenti per anni. Tale biblioteca ha dimostrato la sua solidità.

Quando sei già su Servlet 3.0 o versioni successive, utilizza l'API nativa

Se stai utilizzando almeno Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, ecc.), Puoi semplicemente utilizzare l'API standard fornita HttpServletRequest#getPart()per raccogliere i singoli elementi di dati del modulo multipart (la maggior parte delle implementazioni Servlet 3.0 utilizzano Apache Per questo, FileUpload sotto le coperte!). Inoltre, i normali campi modulo sono disponibili getParameter()nel solito modo.

Prima annota il tuo servlet con lo @MultipartConfigscopo di farlo riconoscere e supportare le multipart/form-datarichieste e quindi mettersi getPart()al lavoro:

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

Quindi, implementa doPost()come segue:

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)
}

Nota il Path#getFileName(). Questa è una correzione MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

Nel caso in cui tu abbia un <input type="file" name="file" multiple="true" />per il caricamento di più file, raccoglili come di seguito (sfortunatamente non esiste un metodo come 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)
    }
}

Quando non sei ancora su Servlet 3.1, ottieni manualmente il nome del file inviato

Si noti che è Part#getSubmittedFileName()stato introdotto in Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, ecc.). Se non si è ancora su Servlet 3.1, è necessario un metodo di utilità aggiuntivo per ottenere il nome del file inviato.

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

Notare la correzione MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

Quando non sei ancora su Servlet 3.0, usa Apache Commons FileUpload

Se non sei ancora su Servlet 3.0 (non è il momento di eseguire l'aggiornamento?), La pratica comune è quella di utilizzare FileUpload di Apache Commons per analizzare le richieste di dati in moduli multipart. Ha un'eccellente guida per l'utente e domande frequenti (esaminare attentamente entrambi). C'è anche O'Reilly (" cos ") MultipartRequest, ma ha alcuni bug (minori) e non viene più mantenuto attivamente per anni. Non consiglierei di usarlo. Apache Commons FileUpload è ancora attivamente gestito e attualmente molto maturo.

Per utilizzare FileUpload di Apache Commons, devi avere almeno i seguenti file nel tuo webapp /WEB-INF/lib:

Il tuo tentativo iniziale è fallito molto probabilmente perché hai dimenticato l'IO comune.

Ecco un esempio iniziale di come potrebbe apparire il doPost()tuo UploadServletquando usi 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);
    }

    // ...
}

E 'molto importante che non si chiama getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), ecc sulla stessa richiesta in anticipo. Altrimenti il ​​contenitore servlet leggerà e analizzerà il corpo della richiesta e quindi Apache Commons FileUpload otterrà un corpo della richiesta vuoto. Vedi anche ao ServletFileUpload # parseRequest (richiesta) restituisce un elenco vuoto .

Nota il FilenameUtils#getName(). Questa è una correzione MSIE per ottenere il nome del file. Questo browser invia erroneamente il percorso completo del file lungo il nome anziché solo il nome del file.

In alternativa puoi anche racchiudere tutto questo in un oggetto Filterche analizza tutto automaticamente e rimettere il materiale nella parametermap della richiesta in modo da poter continuare a utilizzare request.getParameter()il solito modo e recuperare il file caricato da request.getAttribute(). Puoi trovare un esempio in questo articolo del blog .

Soluzione per il bug di GlassFish3 di getParameter()restituzione ancoranull

Si noti che le versioni di Glassfish precedenti alla 3.1.2 avevano un bug in cui i getParameter()ritorni ancora null. Se si sta prendendo di mira un tale contenitore e non è possibile aggiornarlo, è necessario estrarre il valore getPart()con l'aiuto di questo metodo di utilità:

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

Salvataggio del file caricato (non usare getRealPath()part.write()!)

Vai alle seguenti risposte per i dettagli su come salvare correttamente il ottenuto InputStream(la fileContentvariabile come mostrato nei frammenti di codice sopra) su disco o database:

Elaborazione del file caricato

Vai alle seguenti risposte per i dettagli su come pubblicare correttamente il file salvato dal disco o dal database al client:

Ajaxifying the form

Vai alle seguenti risposte su come caricare utilizzando Ajax (e jQuery). Si noti che non è necessario modificare il codice servlet per raccogliere i dati del modulo! Solo il modo in cui rispondi può essere cambiato, ma questo è piuttosto banale (cioè invece di inoltrare a JSP, basta stampare un po 'di JSON o XML o persino un testo semplice a seconda di ciò che lo script responsabile della chiamata Ajax si aspetta).


Spero che tutto ciò aiuti :)


Ah scusa, stavo vedendo request.getParts("file")ed ero confuso x_x
Kagami Sascha Rosylight

Con Servlet 3.0, se MultipartConfigviene violata una condizione (ad esempio maxFileSize:), la chiamata request.getParameter()restituisce null. È apposta? Che cosa succede se ottengo alcuni parametri (di testo) regolari prima di chiamare getPart(e controllare per un IllegalStateException)? Questo provoca un NullPointerExceptionlancio prima che io abbia la possibilità di verificare il IllegalStateException.
theyuv

@BalusC Ho creato un post correlato a questo, hai idea di come recuperare informazioni aggiuntive da File API webKitDirectory. Maggiori dettagli qui stackoverflow.com/questions/45419598/…
Rapster

Se non sei su Servlet 3.0 e usi il trucco FileUpload, ho scoperto che non puoi leggere il file dalla richiesta più di una volta. Se hai bisogno di questa funzionalità, potresti voler guardare il MultiPartFilter di Spring. Questo post è un buon esempio di lavoro: stackoverflow.com/a/21448087/1048376
splashout

1
Sì, se qualcuno tenta di utilizzare il codice nella sezione 3.0 con Tomcat 7, potrebbero String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
riscontrare

26

Se ti capita di usare Spring MVC, ecco come: (Lascio questo qui nel caso qualcuno lo trovi utile).

Utilizzare un modulo con l' enctypeattributo impostato su " multipart/form-data" (uguale alla risposta di BalusC)

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

Nel controller, mappare il parametro di richiesta fileper MultipartFiledigitare come segue:

@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
    }
}

È possibile ottenere il nome file e le dimensioni usando MultipartFile's getOriginalFilename()e getSize().

L'ho provato con la versione Spring 4.1.1.RELEASE.


Se non sbaglio, questo richiede la configurazione di un bean nella configurazione dell'applicazione del server ...
Kenny Worden,

11

Devi common-io.1.4.jarincludere il file nella tua libdirectory o se stai lavorando in qualsiasi editor, come NetBeans, devi andare alle proprietà del progetto e aggiungere semplicemente il file JAR e il gioco è fatto.

Per ottenere il common.io.jarfile basta cercarlo su Google o semplicemente visitare il sito Web Apache Tomcat dove è disponibile l'opzione per il download gratuito di questo file. Ma ricorda una cosa: scarica il file ZIP binario se sei un utente Windows.


Non riesco a trovare .jarma .zip. Vuoi dire .zip?
Malwinder Singh,

10

Senza componente o libreria esterna in Tomcat 6 o 7

Abilitazione del caricamento nel file 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>

COME PUOI VEDERE :

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

Caricamento di file tramite JSP. File:

Nel file 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=""/>

Nel file JSP o nel 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();

Modificare il codice per esigenze servlet, come max-file-size , max-richiesta-size e altre opzioni che è possibile impostare ...


9

Sto usando un servlet comune per ogni modulo HTML, che abbia allegati o meno. Questo Servlet restituisce un punto in TreeMapcui le chiavi sono jsp name Parametri e valori sono Input utente e salva tutti gli allegati nella directory fissa e in seguito rinominate la directory di vostra scelta. Qui Connections è la nostra interfaccia personalizzata con oggetto di connessione. Penso che questo ti aiuterà

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 quale dovrebbe essere il percorso del file se sto usando un server live o vivo il mio progetto caricando i file sul server
AmanS

2
Qualsiasi directory in live server. Se si scrive un codice per creare una directory in servlet, la directory verrà creata in live srver
sentirsi bene e programmare il

8

Per Spring MVC ho provato per ore a farlo e sono riuscito ad avere una versione più semplice che ha funzionato per prendere forma sia i dati che l'immagine.

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

Controller da gestire

@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");
    }
}

Spero che sia d'aiuto :)


Potete per favore condividere selezionare il modulo immagine db mysql e mostrarlo su jsp / html?
Ved Prakash,

6

Un'altra fonte di questo problema si verifica se si utilizza Geronimo con il suo Tomcat incorporato. In questo caso, dopo molte iterazioni di test di commons-io e commons-fileupload, il problema sorge da un classloader genitore che gestisce i barattoli commons-xxx. Questo deve essere prevenuto. L'incidente si è sempre verificato in:

fileItems = uploader.parseRequest(request);

Si noti che il tipo Elenco di fileItems è stato modificato con la versione corrente di file di caricamento comune in modo da essere specificamente diverso dalle List<FileItem>versioni precedenti in cui era generico List.

Ho aggiunto il codice sorgente per commons-fileupload e commons-io nel mio progetto Eclipse per tracciare l'errore reale e alla fine ho avuto un'idea. Innanzitutto, l'eccezione generata è di tipo Gettabile non l'eccezione FileIOException dichiarata e nemmeno l'eccezione (queste non verranno intrappolate). In secondo luogo, il messaggio di errore è offuscato in quanto indicava che la classe non è stata trovata perché axis2 non è riuscito a trovare commons-io. Axis2 non è affatto utilizzato nel mio progetto ma esiste come cartella nella sottodirectory del repository Geronimo come parte dell'installazione standard.

Alla fine, ho trovato 1 posto che ha posto una soluzione funzionante che ha risolto con successo il mio problema. È necessario nascondere i vasetti dal caricatore principale nel piano di distribuzione. Questo è stato messo in geronimo-web.xml con il mio file completo mostrato sotto.

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

Ecco un esempio usando 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

Il modo più semplice potrebbe venire fuori per i file e i controlli di input, senza un miliardo di librerie:

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

puoi caricare il file usando jsp / servlet.

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

dall'altro lato server. usa il seguente codice.

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

Da questo oggetto devi ottenere elementi e campi del file, quindi puoi archiviarli nel server come segue:

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

-2

Invio di più file per file che dobbiamo usare enctype="multipart/form-data"
e per inviare l' uso di più file multiple="multiple"nel tag di input

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

2
Come potremmo fare getPart ("fileattachments") in modo da ottenere invece una matrice di parti? Non penso che getPart per più file funzionerà?
CyberMew,

-2

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

FILE DEL 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

Compilare sopra Servlet UploadServlet e creare la voce richiesta nel file web.xml come segue.

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.