Wie zum hochladen von Dateien auf server mit JSP - /Servlet?
Wie kann ich Dateien hochladen, um server mit JSP - /Servlet? Ich versuchte dies:
<form action="upload" method="post">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
Jedoch bekomme ich nur den Dateinamen, nicht den Inhalt der Datei. Wenn ich enctype="multipart/form-data"
zu den <form>
, dann request.getParameter()
zurück null
.
Während der Forschung stieß ich auf Apache Common FileUpload. Ich versuchte dies:
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); //This line is where it died.
Leider die servlet-Ausnahmefehler ohne eine klare Botschaft und die Ursache. Hier ist der 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)
Vielleicht ist dieser Artikel hilfreich: baeldung.com/upload-file-servlet
InformationsquelleAutor Thang Pham | 2010-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einführung
Durchsuchen und wählen Sie eine Datei für den upload benötigen Sie einen HTML -
<input type="file">
Feld in der form. Wie bereits in der Der HTML-Spezifikation verwenden Sie denPOST
- Methode und dieenctype
- Attribut des Formulars zu setzen"multipart/form-data"
.Nach dem Absenden eine solche form, die binären multipart-form-Daten im request-body in ein anderes format, als wenn die
enctype
ist nicht festgelegt.Bevor Servlet 3.0, die Servlet-API nicht nativ unterstützt
multipart/form-data
. Es unterstützt nur die Standard-form enctype vonapplication/x-www-form-urlencoded
. Dierequest.getParameter()
und Konsorten würden alle zurücknull
bei Verwendung von multipart form data. Dies ist, wo der bekannte Apache Commons FileUpload kam ins Bild.Nicht manuell analysieren!
Können Sie in der Theorie analysiert den request-body selbst
ServletRequest#getInputStream()
. Dies ist jedoch eine genaue und mühsame Arbeit, die erfordert eine genaue Kenntnis der RFC2388. Sie sollten nicht versuchen, tun dies auf eigene Faust oder copypaste einige homegrown-Bibliothek-weniger code, der sich an anderer Stelle auf den Internet. Viele online-Quellen versagt haben hart in dieser, wie roseindia.net. Siehe auch hochladen der pdf-Datei. Sollten Sie lieber eine Reale Bibliothek, die verwendet wird (und implizit getestet!) von Millionen von Nutzern seit Jahren. Die Bibliothek hat sich die Robustheit., Wenn Sie bereits auf Servlet 3.0 oder höher, verwenden Sie das native API
Wenn Sie mit mindestens Servlet 3.0 (Tomcat 7, Jetty 9, JBoss 6, GlassFish 3, etc), dann kann man nur verwenden Sie standard-API zur Verfügung gestellt
HttpServletRequest#getPart()
zu sammeln, die einzelnen multipart form data items (die meisten Servlet-3.0-Implementierungen tatsächlich nutzen Apache Commons FileUpload unter der Decke!). Auch normale Formular-Felder verfügbar sind, indem SiegetParameter()
den üblichen Weg.Erste Anmerkungen in Ihren servlet mit
@MultipartConfig
um zu lassen, anzuerkennen und zu unterstützenmultipart/form-data
Anfragen und bekommen somitgetPart()
arbeiten:Dann, die Umsetzung seiner
doPost()
wie folgt:Hinweis: die
Path#getFileName()
. Dies ist eine MSIE-Korrektur, als um die Erlangung der name der Datei. Dieser browser sendet fälschlicherweise den vollen Datei-Pfad und den Namen anstatt nur den Dateinamen.Falls Sie eine
<input type="file" name="file" multiple="true" />
für multi-Datei-upload, sammeln Sie Sie, wie unten (leider gibt es keine solche Methode, wierequest.getParts("file")
):, Wenn Sie nicht auf Servlet 3.1 noch manuell vorgelegt bekommen Dateiname
Beachten Sie, dass
Teil#getSubmittedFileName()
wurde eingeführt, Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, etc). Wenn Sie nicht auf Servlet 3.1 noch, dann benötigen Sie eine zusätzliche utility-Methode, um die eingereichten Datei name.Hinweis: der MSIE-Korrektur, als um die Erlangung der name der Datei. Dieser browser sendet fälschlicherweise den vollen Datei-Pfad und den Namen anstatt nur den Dateinamen.
, Wenn Sie nicht auf Servlet 3.0 noch, Apache Commons FileUpload
Wenn Sie nicht auf Servlet 3.0 noch (ist es nicht langsam Zeit für ein upgrade?), die gängige Praxis ist es, Apache Commons FileUpload zu analysieren, die multpart Daten in das Formular Anfragen. Es hat eine ausgezeichnete Bedienungsanleitung und FAQ (vorsichtig gehen Sie durch beide). Es gibt auch die O ' Reilly ("cos")
MultipartRequest
, aber es hat einige (kleinere) bugs und wird nicht mehr aktiv gepflegt, für Jahre. Ich würde nicht empfehlen es zu benutzen. Apache Commons FileUpload ist noch aktiv gepflegt und aktuell sehr ausgereift.Um die Verwendung der Apache Commons FileUpload, müssen Sie mindestens die folgenden Dateien in Ihre webapp ist
/WEB-INF/lib
:commons-fileupload.jar
commons-io.jar
Ihre erste Versuch scheiterte, wahrscheinlich, weil Sie vergessen haben, die commons-IO.
Hier ein kickoff Beispiel, wie die
doPost()
IhrerUploadServlet
Aussehen kann, wenn Sie mithilfe von Apache Commons FileUpload:Ist es sehr wichtig, dass Sie nicht nennen
getParameter()
,getParameterMap()
,getParameterValues()
,getInputStream()
,getReader()
, etc auf die gleiche Anfrage im Voraus. Ansonsten ist der servlet-container Lesen und Parsen der Anfrage Körper und damit die Apache Commons FileUpload wird eine leere Anfrage Körper. Siehe auch eine.o. ServletFileUpload#parseRequest(Anfrage) gibt eine leere Liste zurück.Hinweis: die
FilenameUtils#getName()
. Dies ist eine MSIE-Korrektur, als um die Erlangung der name der Datei. Dieser browser sendet fälschlicherweise den vollen Datei-Pfad und den Namen anstatt nur den Dateinamen.Alternativ können Sie auch wickeln Sie diese alle in einer
Filter
die analysiert alles automagisch und legte die Sachen wieder in die parametermap der Anfrage, so dass Sie fortfahren können, mitrequest.getParameter()
den üblichen Weg und rufen Sie die hochgeladene Datei, indem Sierequest.getAttribute()
. Ein Beispiel finden Sie in diesem blog-Artikel.Workaround für GlassFish3 Fehler von
getParameter()
noch die Rückkehrnull
Beachten Sie, dass Glassfish-Versionen, die älter als 3.1.2 hatte ein bug wobei die
getParameter()
noch zurücknull
. Wenn Sie auf solch ein container und kann nicht aktualisieren, dann müssen Sie extrahieren Sie den Wert vongetPart()
mit Hilfe dieser utility-Methode:Speichern von hochgeladenen Datei (verwenden Sie nicht
getRealPath()
nochpart.write()
!)Kopf zu folgenden Antworten für die im detail auf richtig speichern der erhaltenen
InputStream
(diefileContent
variable wie im obigen code-Schnipsel) auf der Festplatte oder der Datenbank:Portion hochgeladene Datei
Kopf zu folgenden Antworten für die im detail auf diese richtig zu bedienen, die gespeicherte Datei von der Festplatte oder der Datenbank an den client zurück:
Ajaxifying form
Kopf zu den folgenden Antworten, wie upload mit Ajax und jQuery). Beachten Sie, dass die servlet-code zu sammeln, die Formular-Daten müssen nicht geändert werden! Nur die Art und Weise, wie Sie reagieren können geändert werden, aber das ist eher trivial (d.h. statt der Weiterleitung zur JSP, drucken Sie einfach einige JSON-oder XML-oder sogar nur-text-je nachdem, was das Skript verantwortlich für den Ajax-Aufruf erwartet).
Hoffe, das alles hilft 🙂
request.getParts("file")
und war verwirrt x_xMit Servlet 3.0, wenn eine
MultipartConfig
Bedingung verletzt wird (z.B.:maxFileSize
), ruftrequest.getParameter()
null zurück. Ist das mit Absicht? Was ist, wenn ich einige normale (text -) Parameter vor dem AufrufgetPart
(und Prüfung für einIllegalStateException
)? Dies bewirkt, dass einNullPointerException
geworfen werden, bevor ich eine chance habe, zu prüfen, für dieIllegalStateException
.Bitte lassen Sie mich wissen, wenn meine Frage unklar ist. Danke.
Ich erstellt einen post in diesem Zusammenhang haben Sie eine Idee, wie konnte ich wieder extra-infos aus der Datei API-webKitDirectory. Mehr Informationen finden Sie hier stackoverflow.com/questions/45419598/...
Ja, wenn jemand versucht, den code verwenden, die in 3.0-Abschnitt mit tomcat 7, könnten Sie Gesicht Problem in
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
Teil ähnlich wie mirInformationsquelleAutor BalusC
Wenn Sie geschehen, um zu verwenden, Spring MVC, dies ist, wie:
(Ich gehe hier in den Fall, dass jemand es nützlich finden).
Verwenden Sie ein Formular mit
enctype
Attribut auf "multipart/form-data
" (Gleiche wie BalusC Antwort)In Ihrem controller, map der request-parameter
file
zuMultipartFile
Typ wie folgt:Können Sie den Dateinamen und die Größe mit
MultipartFile
'sgetOriginalFilename()
undgetSize()
.Getestet hab ich dies mit Spring version
4.1.1.RELEASE
.InformationsquelleAutor Amila
Müssen Sie die
common-io.1.4.jar
- Datei, um Sie in Ihrlib
Verzeichnis, oder wenn Sie in einem beliebigen editor wie NetBeans, dann müssen Sie auf Eigenschaften, und fügen Sie einfach die JAR-Datei, und Sie werden getan werden.Um die
common.io.jar
Datei gerade google es oder gehen Sie einfach auf die Apache Tomcat website, wo Sie die Möglichkeit für einen kostenlosen download dieser Datei. Aber denken Sie daran eine Sache: die Binärdatei herunterladen ZIP-Datei, wenn Sie ein Windows-Benutzer..jar
aber.zip
. Meinst du.zip
?InformationsquelleAutor Pranav
Ich bin Mit gängigen Servlet für jeder Html-Formular, ob es Anlagen hat oder nicht.
Dieses Servlet liefert eine
TreeMap
wo die Tasten sind jsp-name-Parameter und-Werte sind Eingaben des Benutzers und speichert alle Anhänge in festen Verzeichnis und später benennen Sie das Verzeichnis Ihrer Wahl.Hier Verbindungen ist unsere benutzerdefinierte Schnittstelle, die connection-Objekt. Ich denke, dass dies wird Ihnen helfen,Jedes Verzeichnis, in live-server.wenn Sie schreiben einen code, um ein Verzeichnis erstellen, in servlet-dann-Verzeichnis erstellt wird, in der live-srver
InformationsquelleAutor feel good and programming
Ohne Komponente oder eine externe Bibliothek in Tomcat 6 o 7
Ermöglicht Upload in die web.xml Datei:
http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Enabling%20File%20Uploads.
WIE SIE SEHEN KÖNNEN:
Hochladen von Dateien mit JSP. Dateien:
In der html-Datei
In der JSP-Datei oder Servlet
Bearbeiten Sie Ihre code-servlet-Anforderungen, wie max-file-size, max-request-Größe und andere Optionen, die Sie können, um...
InformationsquelleAutor chepe lucho
Für Spring MVC
Ich habe versucht, für Stunden, dies zu tun
und es geschafft zu haben, eine einfachere version, die funktionierte für die Aufnahme von form-input-Daten und Bild.
Controller zu handhaben
Hoffe es hilft 🙂
InformationsquelleAutor Shivangi Gupta
Anderen Quelle, die dieses problem tritt auf, wenn Sie mit Geronimo mit seinen embedded Tomcat. In diesem Fall, nach vielen Iterationen des Tests commons-io und die commons-fileupload, entsteht das problem, aus einem parent-classloader, der Umgang mit den commons-xxx Gläser. Dies muss verhindert werden. Der Absturz trat immer auf:
Beachten Sie, dass die Liste Typ der fileItems geändert wurde mit der aktuellen version von commons-fileupload, die speziell
List<FileItem>
im Gegensatz zu früheren Versionen, wo es war, genericList
.Habe ich den source code für die commons-fileupload und commons-io in meinem Eclipse-Projekt auf die Spur, die tatsächlichen Fehler und habe endlich einige Einblicke. Erstens, die Ausnahme, die ausgelöst wird der Typ Throwable nicht die angegebenen FileIOException noch Ausnahme (diese werden nicht gefangen). Zweitens, die Fehlermeldung ist obfuscatory, dass es in der angegeben Klasse nicht gefunden wird, weil axis2 konnte nicht finden, commons-io. Axis2 ist nicht in meinem Projekt, sondern existiert als Ordner in das Geronimo-repository-Verzeichnis als Teil der standard-installation.
Schließlich fand ich 1 Platz, stellte eine funktionierende Lösung, die erfolgreich mein problem gelöst. Sie verbergen müssen die Gläser von Eltern-loader in den deployment plan. Dieser wurde in geronimo-web.xml mit meinem vollen Datei unten dargestellt.
InformationsquelleAutor Geoffrey Malafsky
Hier ist ein Beispiel für die Verwendung der apache commons-fileupload:
InformationsquelleAutor thouliha
können Sie upload file using jsp /servlet.
auf der anderen Seite server-Seite.
verwenden Sie folgenden code.
InformationsquelleAutor Mitul Maheshwari
Aus diesem Objekt haben Sie, um Datei-Elemente und Felder, dann Sie können speichern in server wie folgt:
InformationsquelleAutor Mahender Reddy Yasa
Senden mehrere Datei-für-Datei, die wir verwenden
enctype="multipart/form-data"
und senden Sie mehrere Dateien verwenden
multiple="multiple"
im input-tagInformationsquelleAutor rohan kamat
HTML-SEITE
SERVLET-DATEI
web.xml
Kompilieren oben servlet UploadServlet und erstellen Sie die erforderlichen Eintrag in web.xml Datei wie folgt.
InformationsquelleAutor Himanshu Patel