如何使用JSP / Servlet將文件上傳到服務器? 我嘗試了這個: php
<form action="upload" method="post"> <input type="text" name="description" /> <input type="file" name="file" /> <input type="submit" /> </form>
可是,我只獲得文件名,而不獲得文件內容。 當我將enctype="multipart/form-data"
到<form>
,而後request.getParameter()
返回null
。 html
在研究期間,我偶然發現了Apache Common FileUpload 。 我嘗試了這個: java
FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List items = upload.parseRequest(request); // This line is where it died.
不幸的是,該servlet拋出了一個異常,沒有明確的消息和緣由。 這是堆棧跟蹤: web
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)
您須要將common-io.1.4.jar
文件包含在您的lib
目錄中,或者若是您正在使用任何編輯器(例如NetBeans),那麼您須要轉到項目屬性並僅添加JAR文件,您將完成。 apache
要獲取common.io.jar
文件,只需在Google上對其進行搜索,或直接訪問Apache Tomcat網站,便可在該網站上免費下載該文件。 可是請記住一件事:若是您是Windows用戶,請下載二進制ZIP文件。 tomcat
我正在爲每一個 HTML表單使用通用Servlet,不管它是否具備附件。 此Servlet返回一個TreeMap
,其中的鍵是jsp名稱,參數和值是User Inputs,並將全部附件保存在固定目錄中,而後您重命名您選擇的目錄。這裏Connections是具備鏈接對象的自定義接口。 我想這對你有幫助 服務器
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; } }
若是將Geronimo及其嵌入式Tomcat使用,則會發生此問題。 在這種狀況下,在測試commons-io和commons-fileupload的許多迭代以後,問題出在父類加載器處理commons-xxx jar上。 必須防止這種狀況。 崩潰老是發生在: 併發
fileItems = uploader.parseRequest(request);
請注意,fileItems的List類型已隨着commons-fileupload的當前版本更改成特定的List<FileItem>
,而之前的版本是通用List
。 app
我將commons-fileupload和commons-io的源代碼添加到個人Eclipse項目中,以跟蹤實際錯誤並最終得到一些看法。 首先,拋出的異常類型爲Throwable,而不是聲明的FileIOException或Exception(不會被捕獲)。 其次,錯誤消息使人困惑,由於它指出找不到類,由於axis2找不到commons-io。 Axis2根本不在個人項目中使用,而是做爲Geronimo存儲庫子目錄中的文件夾存在,做爲標準安裝的一部分。 jsp
最終,我找到了一個提出有效解決方案的地方,成功解決了個人問題。 您必須在部署計劃中對父加載器隱藏jar。 這已放入geronimo-web.xml中,其完整文件以下所示。
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>
爲文件發送多個文件,咱們必須使用enctype="multipart/form-data"
併發送多個文件,請在輸入標籤中使用multiple="multiple"
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="fileattachments" multiple="multiple"/> <input type="submit" /> </form>
在Tomcat 6 o 7中沒有組件或外部庫
在web.xml文件中啓用上載:
<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>
如您所見 :
<multipart-config> <max-file-size>3145728</max-file-size> <max-request-size>5242880</max-request-size> </multipart-config>
使用JSP上傳文件。 檔案:
在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=""/>
在JSP文件或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();
根據servlet要求編輯代碼,例如max-file-size , max-request-size和其餘能夠設置的選項...