如何使用JSP / Servlet将file upload到服务器?

我怎样才能使用JSP / Servlet上传文件到服务器? 我试过这个:

<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

在研究期间,我偶然发现了Apache Common FileUpload 。 我试过这个:

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

不幸的是,servlet抛出了一个没有明确信息和原因的exception。 这里是堆栈跟踪:

 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) 

介绍

要浏览并select要上传的文件,您需要在表单中<input type="file"> HTML <input type="file">字段。 如HTML规范所述,您必须使用POST方法,并且必须将表单的enctype属性设置为"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> 

提交这样的表单之后,二进制多部分表单数据在请求主体中可以以不同于未设置enctype 格式提供 。

在Servlet 3.0之前,Servlet API本身不支持multipart/form-data 。 它仅支持application/x-www-form-urlencoded的默认表单enctype。 使用多部分表单数据时, request.getParameter()和consorts都将返回null 。 这是众所周知的Apache Commons FileUpload进入图片的地方。

不要手动parsing它!

理论上你可以基于ServletRequest#getInputStream()parsing请求体。 但是,这是一个精确而乏味的工作,需要对RFC2388有精确的了解。 你不应该试图自己做这个,或者复制一些在互联网上其他地方find的本地无库代码。 许多在线资源在这方面都失败了,比如roseindia.net。 另见pdf文件的上传 。 你应该使用一个真正的图书馆,这个图书馆已经被数百万用户使用(并且被隐式testing!)了好多年。 这样的图书馆已经certificate了它的坚固性。

当你已经在Servlet 3.0或更高版本上时,使用本机API

如果您至less使用了Servlet 3.0(Tomcat 7,Jetty 9,JBoss AS 6,GlassFish 3等),那么您可以使用标准API提供的HttpServletRequest#getPart()来收集单独的多部分表单数据项(大多数Servlet 3.0实现实际上使用Apache Commons FileUpload在这个封面!)。 此外,常规的表单字段可以通过getParameter()通常的方式获得。

首先使用@MultipartConfig注释您的servlet,以便让它识别并支持multipart/form-data请求,从而使getPart()工作:

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

然后,执行它的doPost()如下:

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

请注意Path#getFileName() 。 这是一个MSIE修复程序,以获取文件的名称。 此浏览器错误地发送完整的文件path而不是只有文件名称的名称。

如果你有一个<input type="file" name="file" multiple="true" />多file upload,收集如下(不幸的是,没有这样的方法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())).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) } } 

当你不在Servlet 3.1上时,手动获取提交的文件名

请注意, Part#getSubmittedFileName()是在Servlet 3.1(Tomcat 8,Jetty 9,WildFly 8,GlassFish 4等)中引入的。 如果你还没有使用Servlet 3.1,那么你需要额外的实用程序来获取提交的文件名。

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

请注意MSIE修复以获取文件名称。 此浏览器错误地发送完整的文件path而不是只有文件名称的名称。

如果你还没有使用Servlet 3.0,请使用Apache Commons FileUpload

如果你还没有使用Servlet 3.0(是不是要升级?),通常的做法是利用Apache Commons FileUploadparsing多部分表单数据请求。 它有一个很好的用户指南和常见问题 (仔细通过两个)。 还有O'Reilly(“ cos ”) MultipartRequest ,但它有一些(小的)错误,并且不再被主动维护多年。 我不会推荐使用它。 Apache Commons FileUpload仍然积极维护,目前非常成熟。

为了使用Apache Commons FileUpload,您需要在您的/WEB-INF/lib应用程序的/WEB-INF/lib中至less包含以下文件:

  • commons-fileupload.jar
  • commons-io.jar

你最初的尝试失败的可能性很大,因为你忘记了公共IO。

下面是一个启动示例,在使用Apache Commons FileUpload时, UploadServletdoPost()方式可能如何:

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

事先getReader()在同一个请求中调用getParameter()getParameterMap()getParameterValues()getInputStream()getReader()等非常重要。 否则,servlet容器将读取和parsing请求体,因此Apache Commons FileUpload将得到一个空的请求体。 另请参阅ao ServletFileUpload#parseRequest(request)返回一个空列表 。

请注意FilenameUtils#getName() 。 这是一个MSIE修复程序,以获取文件的名称。 此浏览器错误地发送完整的文件path而不是只有文件名称的名称。

另外,你也可以把它全部包装在一个Filter ,这个Filter自动parsing它,并把这些东西放回到请求的参数映射中,这样你就可以继续使用request.getParameter()方法,通过request.getAttribute() 。 你可以在这篇博客文章中find一个例子 。

GlassFish3 getParameter() bug的解决方法仍然返回null

请注意,早于3.1.2的Glassfish版本有一个错误,其中getParameter()仍然返回null 。 如果您的目标是这样一个容器,并且无法升级它,那么您需要借助此实用程序方法从getPart()提取值:

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

保存上传的文件(不要使用getRealPath()part.write() !)

有关将获取的InputStreamfileContentvariables,如上面的代码片段所示)正确保存到磁盘或数据库的详细信息,请参阅以下答案:

  • 将上传的文件保存在servlet应用程序中的推荐方法
  • 如何上传图像并将其保存在数据库中?
  • 如何将零件转换为Blob,所以我可以将其存储在MySQL?

提供上传的文件

请转到以下答案,了解如何正确地将保存的文件从磁盘或数据库提供回客户端:

  • 使用<h:graphicImage>或<img>标签从webapps / webcontext / deploy文件夹外部加载图像
  • 如何从JSP页面中的数据库中检索和显示图像?
  • 在Java Web应用程序中从应用程序服务器外部提供静态数据的最简单方法
  • 支持HTTPcaching的静态资源servlet的抽象模板

Ajax化表单

请教如何使用Ajax(和jQuery)上传以下答案。 请注意,收集表单数据的servlet代码不需要为此更改! 只有你的回应方式可能会改变,但这是相当微不足道的(而不是转发到JSP,只是打印一些JSON或XML甚至纯文本取决于负责Ajax调用的脚本所期望的)。

  • 如何使用JSP / Servlet和Ajax将file upload到服务器?
  • 通过xmlHttpRequest发送一个文件为multipart
  • HTML5file upload到Java Servlet

希望这一切帮助:)

如果你碰巧使用了Spring MVC,那么这就是:(如果有人觉得它有用的话,我就把它留在这里)。

使用enctype属性设置为“ multipart/form-data ”的multipart/form-data (与BalusC的答案相同)

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

在您的控制器中,将请求参数file映射到MultipartFiletypes,如下所示:

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

您可以使用MultipartFilegetOriginalFilename()getSize()来获取文件名和大小。

我已经用Spring 4.1.1.RELEASEtesting过了。

您需要将common-io.1.4.jar文件包含在lib目录中,或者如果您使用的是NetBeans等编辑器,则需要转到项目属性,然后添加JAR文件,您将完成。

要获取common.io.jar文件,只需要将其放到Google上,或者直接进入Apache Tomcat网站,在那里您可以免费下载该文件。 但请记住一件事:如果您是Windows用户,请下载二进制ZIP文件。

我为每个 Html表单使用通用的Servlet,不pipe它是否有附件。 这个Servlet返回一个TreeMap ,其中的键是jsp名称参数和值是用户input并将所有附件保存在固定目录中,稍后重命名您所select的目录。这里的连接是我们的具有连接对象的自定义接口。 我认为这会帮助你

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

没有组件或外部库在Tomcat 6 o 7

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> 

你可以看到

  <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的要求,如最大文件大小最大请求大小和其他选项,你可以设置…

如果您使用带有embedded式Tomcat的Geronimo,则会出现此问题的另一个来源。 在这种情况下,在testingcommons-io和commons-fileupload的许多迭代之后,问题出现在处理commons-xxx jar的父类加载器中。 这是必须防止的。 事故总是发生在:

 fileItems = uploader.parseRequest(request); 

请注意,fileItems的Listtypes已经随commons-fileupload的当前版本而变化,具体来说是List<FileItem> ,而不是之前版本中的genericsList

我将commons-fileupload和commons-io的源代码添加到了我的Eclipse项目中,以追踪实际的错误并最终得到了一些见解。 首先,抛出的exception是Throwabletypes,而不是FileIOException,甚至Exception(这些都不会被捕获)。 其次,错误信息是混淆的,因为它没有find类,因为axis2找不到commons-io。 我的项目中完全没有使用Axis2,但作为标准安装的一部分,它作为Geronimo存储库子目录中的一个文件夹存在。

最后,我find了一个能够解决我的问题的解决scheme。 您必须在部署计划中隐藏父装载器中的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> 

对于Spring MVC,我一直在尝试几个小时来做​​到这一点,并设法有一个简单的版本,工作的表单input数据和图像。

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

希望它有助于:)

下面是一个使用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); 

你可以使用jsp / servlet上传文件。

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

另一方面服务器端。 使用下面的代码。

  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(); } } } } 
 DiskFileUpload upload=new DiskFileUpload(); 

从这个对象,你必须得到文件项目和领域,然后你可以存储到服务器像跟着

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

发送多个文件的文件,我们必须使用enctype="multipart/form-data"
并在input标签中发送多个文件使用multiple="multiple"

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

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> 

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中

编译上面的servlet UploadServlet并在web.xml文件中创build所需的条目,如下所示。

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