Wie lade ich Dateien mit JSP / Servlet auf den Server hoch?


688

Wie kann ich Dateien mit JSP / Servlet auf den Server hochladen? Ich habe es versucht:

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

Ich erhalte jedoch nur den Dateinamen, nicht den Dateiinhalt. Als ich hinzufügen , enctype="multipart/form-data"auf die <form>dann request.getParameter()zurückkehrt null.

Während der Recherche bin ich auf Apache Common FileUpload gestoßen . Ich habe es versucht:

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

Leider hat das Servlet eine Ausnahme ohne eindeutige Meldung und Ursache ausgelöst. Hier ist die Stapelverfolgung:

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)

Vielleicht ist dieser Artikel hilfreich: baeldung.com/upload-file-servlet
Adam Gerard

Antworten:


1193

Einführung

Zum Durchsuchen und Auswählen einer Datei zum Hochladen benötigen Sie ein HTML- <input type="file">Feld im Formular. Wie in der HTML-Spezifikation angegeben , müssen Sie die POSTMethode verwenden und das enctypeAttribut des Formulars muss festgelegt werden "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>

Nach dem Absenden eines solchen Formulars stehen die binären mehrteiligen Formulardaten im Anforderungshauptteil in einem anderen Format zur Verfügung als beimenctype nicht festgelegt ist.

Vor Servlet 3.0 wurde die Servlet-API von Haus aus nicht unterstützt multipart/form-data. Es wird nur der Standardformular-Enctype von unterstützt application/x-www-form-urlencoded. Die request.getParameter()und -Konsorten würden alle zurückkehren, nullwenn mehrteilige Formulardaten verwendet werden. Hier befindet sich der bekannte Apache Commons FileUpload ins .

Analysieren Sie es nicht manuell!

Sie können den Anfragetext theoretisch selbst anhand von analysieren ServletRequest#getInputStream(). Dies ist jedoch eine präzise und langwierige Arbeit, die genaue Kenntnisse von RFC2388 erfordert . Sie sollten nicht versuchen, dies selbst zu tun oder einen selbst entwickelten Code ohne Bibliothek zu kopieren, der an anderer Stelle im Internet zu finden ist. Viele Online-Quellen wie roseindia.net sind dabei schwer gescheitert. Siehe auch Hochladen der PDF-Datei . Sie sollten lieber eine echte Bibliothek verwenden, die jahrelang von Millionen von Benutzern verwendet (und implizit getestet!) Wird. Eine solche Bibliothek hat ihre Robustheit bewiesen.

Wenn Sie bereits Servlet 3.0 oder höher verwenden, verwenden Sie die native API

Wenn Sie mindestens Servlet 3.0 verwenden (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3 usw.), können Sie einfach die bereitgestellte Standard-API verwenden HttpServletRequest#getPart(), um die einzelnen mehrteiligen Formulardatenelemente zu erfassen (die meisten Servlet 3.0-Implementierungen verwenden tatsächlich Apache Commons FileUpload unter der Decke dafür!). Außerdem sind normale Formularfelder auf getParameter()die übliche Weise verfügbar .

Kommentieren Sie zuerst Ihr Servlet mit @MultipartConfig, damit es multipart/form-dataAnforderungen erkennt und unterstützt und somit getPart()an die Arbeit geht:

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

Implementieren Sie dann doPost()Folgendes:

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

Beachten Sie die Path#getFileName(). Dies ist ein MSIE-Fix zum Abrufen des Dateinamens. Dieser Browser sendet fälschlicherweise den vollständigen Dateipfad entlang des Namens anstelle nur des Dateinamens.

Wenn Sie einen <input type="file" name="file" multiple="true" />Upload für mehrere Dateien haben, sammeln Sie diese wie folgt (leider gibt es keine Methode wie 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)
    }
}

Wenn Sie noch nicht mit Servlet 3.1 arbeiten, rufen Sie den übermittelten Dateinamen manuell ab

Beachten Sie, dass dies Part#getSubmittedFileName()in Servlet 3.1 eingeführt wurde (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4 usw.). Wenn Sie noch nicht mit Servlet 3.1 arbeiten, benötigen Sie eine zusätzliche Dienstprogrammmethode, um den übermittelten Dateinamen abzurufen.

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

Beachten Sie den MSIE-Fix zum Abrufen des Dateinamens. Dieser Browser sendet fälschlicherweise den vollständigen Dateipfad entlang des Namens anstelle nur des Dateinamens.

Wenn Sie noch nicht mit Servlet 3.0 arbeiten, verwenden Sie Apache Commons FileUpload

Wenn Sie noch nicht mit Servlet 3.0 arbeiten (ist es nicht an der Zeit, ein Upgrade durchzuführen ?), Wird in der Regel Apache Commons FileUpload verwendet , um die mehrteiligen Formulardatenanforderungen zu analysieren. Es hat eine ausgezeichnete Bedienungsanleitung und FAQ (gehen Sie beide sorgfältig durch). Es gibt auch den O'Reilly (" cos ") MultipartRequest, aber er hat einige (kleinere) Fehler und wird seit Jahren nicht mehr aktiv gewartet. Ich würde es nicht empfehlen. Apache Commons FileUpload wird immer noch aktiv gepflegt und ist derzeit sehr ausgereift.

Um Apache Commons FileUpload verwenden zu können, müssen mindestens die folgenden Dateien in Ihrer Webanwendung enthalten sein /WEB-INF/lib:

Ihr erster Versuch ist höchstwahrscheinlich fehlgeschlagen, weil Sie die Commons-E / A vergessen haben.

Hier ist ein Kickoff-Beispiel, wie das doPost()von Ihnen UploadServletaussehen könnte, wenn Sie Apache Commons FileUpload verwenden:

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

    // ...
}

Es ist sehr wichtig , dass Sie nicht nennen getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), usw. auf den gleichen Antrag zuvor. Andernfalls liest und analysiert der Servlet-Container den Anforderungshauptteil, sodass Apache Commons FileUpload einen leeren Anforderungshauptteil erhält. Siehe auch ao ServletFileUpload # parseRequest (Anfrage) gibt eine leere Liste zurück .

Beachten Sie die FilenameUtils#getName(). Dies ist ein MSIE-Fix zum Abrufen des Dateinamens. Dieser Browser sendet fälschlicherweise den vollständigen Dateipfad entlang des Namens anstelle nur des Dateinamens.

Alternativ können Sie dies alles auch in eine FilterDatei packen, die alles automatisch analysiert und das Material wieder in die Parameterkarte der Anforderung einfügt, sodass Sie auf request.getParameter()die übliche Weise fortfahren und die hochgeladene Datei von abrufen können request.getAttribute(). Ein Beispiel finden Sie in diesem Blog-Artikel .

Problemumgehung für den GlassFish3-Fehler, getParameter()immer noch zurückzukehrennull

Beachten Sie, dass Glassfish-Versionen älter als 3.1.2 einen Fehler hatten, bei dem das getParameter()immer noch zurückkehrt null. Wenn Sie auf einen solchen Container abzielen und ihn nicht aktualisieren können, müssen Sie den Wert getPart()mithilfe dieser Dienstprogrammmethode extrahieren :

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

Hochgeladene Datei speichern (weder verwenden getRealPath()noch part.write()!)

Weitere Informationen zum ordnungsgemäßen Speichern der erhaltenen InputStream(der fileContentin den obigen Codeausschnitten gezeigten Variablen) auf Festplatte oder Datenbank finden Sie in den folgenden Antworten :

Hochgeladene Datei bereitstellen

Weitere Informationen zum ordnungsgemäßen Bereitstellen der gespeicherten Datei von der Festplatte oder Datenbank auf dem Client finden Sie in den folgenden Antworten:

Ajaxifizierung der Form

Lesen Sie die folgenden Antworten zum Hochladen mit Ajax (und jQuery). Beachten Sie, dass der Servlet-Code zum Sammeln der Formulardaten dafür nicht geändert werden muss! Nur die Art und Weise, wie Sie reagieren, kann geändert werden. Dies ist jedoch eher trivial (dh anstatt an JSP weiterzuleiten, drucken Sie einfach JSON oder XML oder sogar einfachen Text, je nachdem, was das für den Ajax-Aufruf verantwortliche Skript erwartet).


Hoffe das alles hilft :)


Ah sorry, ich sah request.getParts("file")und war verwirrt x_x
Kagami Sascha Rosylight

Wenn mit Servlet 3.0 eine MultipartConfigBedingung verletzt wird (z. B. :) maxFileSize, gibt der Aufruf request.getParameter()null zurück. Ist das absichtlich? Was ist, wenn ich vor dem Aufruf getPart(und der Suche nach einem IllegalStateException) einige reguläre (Text-) Parameter erhalte ? Dies führt NullPointerExceptiondazu, dass ein geworfen wird, bevor ich die Möglichkeit habe, nach dem zu suchen IllegalStateException.
Theyuv

@BalusC Ich habe einen entsprechenden Beitrag erstellt. Haben Sie eine Idee, wie ich zusätzliche Informationen aus der Datei-API webKitDirectory abrufen kann? Weitere Details hier stackoverflow.com/questions/45419598/…
Rapster

Wenn Sie nicht mit Servlet 3.0 arbeiten und den Trick "FileUpload" verwenden, können Sie die Datei aus der Anforderung nur einmal lesen. Wenn Sie diese Funktionalität benötigen, sollten Sie sich den MultiPartFilter von Spring ansehen. Dieser Beitrag hat ein gutes Arbeitsbeispiel: stackoverflow.com/a/21448087/1048376
Splashout

1
Ja, wenn jemand versucht, den Code in Abschnitt 3.0 mit Tomcat 7 zu verwenden, könnte String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.er auf ein ähnliches Problem
stoßen

26

Wenn Sie Spring MVC verwenden, gehen Sie wie folgt vor: (Ich lasse dies hier, falls jemand es nützlich findet.)

Verwenden Sie ein Formular mit dem enctypeAttribut " multipart/form-data" (wie die Antwort von BalusC).

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

In Ihrem Controller, ordnen Sie die Anfrageparameter filezu MultipartFileTyp wie folgt:

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

Sie können den Dateinamen und die Größe mit MultipartFile's getOriginalFilename()und erhalten getSize().

Ich habe dies mit der Spring-Version getestet 4.1.1.RELEASE.


Wenn ich mich nicht irre, müssen Sie eine Bean in der Anwendungskonfiguration Ihres Servers konfigurieren ...
Kenny Worden

11

Sie müssen die common-io.1.4.jarDatei in Ihr libVerzeichnis aufnehmen, oder wenn Sie in einem Editor wie NetBeans arbeiten, müssen Sie zu den Projekteigenschaften gehen und einfach die JAR-Datei hinzufügen, und fertig.

Um die common.io.jarDatei zu erhalten, googeln Sie sie einfach oder besuchen Sie die Apache Tomcat- Website, auf der Sie die Option zum kostenlosen Download dieser Datei erhalten. Beachten Sie jedoch Folgendes: Laden Sie die binäre ZIP-Datei herunter, wenn Sie Windows verwenden.


Kann nicht finden .jaraber .zip. Meinst du .zip?
Malwinder Singh

10

Ohne Komponente oder externe Bibliothek in Tomcat 6 o 7

Aktivieren des Uploads in der Datei web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manuell-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>

WIE SIE SEHEN KÖNNEN :

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

Hochladen von Dateien mit JSP. Dateien:

In der HTML-Datei

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

In der JSP-Datei oder im 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();

Bearbeiten Sie Ihren Code an die Servlet-Anforderungen wie maximale Dateigröße , maximale Anforderungsgröße und andere Optionen, die Sie festlegen können ...


9

Ich verwende ein gemeinsames Servlet für jedes HTML-Formular, unabhängig davon, ob es Anhänge enthält oder nicht. Dieses Servlet gibt a zurück, TreeMapwobei die Schlüssel jsp name sind. Parameter und Werte sind Benutzereingaben und speichert alle Anhänge im festen Verzeichnis. Später benennen Sie das Verzeichnis Ihrer Wahl um. Hier ist Connections unsere benutzerdefinierte Schnittstelle mit Verbindungsobjekt. Ich denke, das wird dir helfen

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 was sollte der Dateipfad sein, wenn ich Live-Server verwende oder ich lebe mein Projekt durch Hochladen von Dateien auf den Server
AmanS

2
Jedes Verzeichnis in Live-Server. Wenn Sie einen Code schreiben, um ein Verzeichnis in Servlet zu erstellen, wird das Verzeichnis in Live-Server erstellt
fühlen Sie sich gut und programmieren Sie

8

Für Spring MVC habe ich stundenlang versucht, dies zu tun, und es ist mir gelungen, eine einfachere Version zu haben, die sowohl für die Eingabe von Daten als auch für Bilder geeignet ist.

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

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

Ich hoffe es hilft :)


Können Sie bitte das ausgewählte Bild von db mysql freigeben und auf jsp / html anzeigen?
Ved Prakash

6

Eine weitere Ursache für dieses Problem tritt auf, wenn Sie Geronimo mit seinem eingebetteten Tomcat verwenden. In diesem Fall tritt das Problem nach vielen Iterationen des Testens von commons-io und commons-fileupload von einem übergeordneten Klassenladeprogramm auf, das die commons-xxx-Jars verarbeitet. Dies muss verhindert werden. Der Absturz ereignete sich immer um:

fileItems = uploader.parseRequest(request);

Beachten Sie, dass sich der Listentyp von fileItems mit der aktuellen Version von commons-fileupload geändert hat, um List<FileItem>im Gegensatz zu früheren Versionen, in denen es generisch war , spezifisch zu seinList .

Ich habe den Quellcode für commons-fileupload und commons-io in mein Eclipse-Projekt eingefügt, um den tatsächlichen Fehler zu verfolgen, und schließlich einen Einblick erhalten. Erstens ist die ausgelöste Ausnahme vom Typ Throwable, nicht die angegebene FileIOException oder sogar Exception (diese werden nicht abgefangen). Zweitens ist die Fehlermeldung insofern verschleiert, als sie angibt, dass die Klasse nicht gefunden wurde, weil axis2 commons-io nicht finden konnte. Axis2 wird in meinem Projekt überhaupt nicht verwendet, ist jedoch im Rahmen der Standardinstallation als Ordner im Geronimo-Repository-Unterverzeichnis vorhanden.

Schließlich fand ich einen Ort, der eine funktionierende Lösung darstellte, die mein Problem erfolgreich löste. Sie müssen die Jars vor dem übergeordneten Loader im Bereitstellungsplan ausblenden. Dies wurde in geronimo-web.xml mit meiner vollständigen Datei unten gezeigt.

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

Hier ist ein Beispiel mit 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

Der einfachste Weg für Dateien und Eingabesteuerungen ohne eine Milliarde Bibliotheken:

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

Sie können Dateien mit jsp / servlet hochladen.

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

auf der anderen Seite Server-Seite. Verwenden Sie den folgenden Code.

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

Von diesem Objekt müssen Sie Dateielemente und Felder abrufen, die Sie dann wie folgt auf dem Server speichern können:

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

-2

Senden mehrerer Dateien für Dateien, die wir verwenden müssen, enctype="multipart/form-data"
und Senden mehrerer Dateien multiple="multiple"im Eingabe-Tag

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

2
Wie würden wir getPart ("fileattachments") ausführen, um stattdessen eine Reihe von Teilen zu erhalten? Ich glaube nicht, dass getPart für mehrere Dateien funktioniert?
CyberMew

-2

HTML-SEITE

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

SERVLET-DATEI

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

Kompilieren Sie das obige Servlet UploadServlet und erstellen Sie den erforderlichen Eintrag in der Datei web.xml wie folgt.

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.