如何使用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和其余能够设置的选项...