WEB文件上传也是采用POST的方式。不过需要将FORM的enctype属性设置为:multipart/form-data。由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性默认是application/x-www-form-urlencoded,浏览器将使用ASCII向服务器发送数据,导致发送文件失败。
上传文件使用文件域(<input type="file">),并把FORM的Enctype设置为multipart/form/data。
工程结构如下:
以下是上传文件的客户端代码:upload.html。
<!DOCTYPE html> <html> <head> <title>upload.html</title> <meta http-equiv="content-type" content="text/html";charset="UTF-8" > </head> <body> <form action="servlet/UploadServlet" method="post" enctype="multipart/form-data"> <div align="center"> <fieldset style="width:80%"> <legend>上传文件</legend><br/> <div class='line'> <div align='left' class="leftDiv">上传文件一</div> <div align='left' class="rightDiv"> <input type="file" name="file1" class="text"> </div> </div> <div class='line'> <div align='left' class="leftDiv">上传文件二</div> <div align='left' class="rightDiv"> <input type="file" name="file2" class="text"> </div> </div> <div class='line'> <div align='left' class="leftDiv">上传文件说明一</div> <div align='left' class="rightDiv"> <input type="text" name="description1" class="text"> </div> </div> <div class='line'> <div align='left' class="leftDiv">上传文件说明二</div> <div align='left' class="rightDiv"> <input type="text" name="description2" class="text"> </div> </div> <div class='line'> <div align='left' class="leftDiv">上传文件说明二</div> <div align='left' class="rightDiv"> <input type="submit" value=" 上传文件" class="button"> </div> </div> </fieldset> </div> </form> </body> </html>
运行结果如下:
上传文件服务器端:
由于上传文件时浏览器是以二进制的方式发送数据,因此Servlet里不能简单的通过HttpServletRequest的getParameter()方法。要想获取内容,就必须更具HTTP协议所规定的的格式解析浏览器提交的Request。
这里,使用Apache开源的jar包。Commons Fileupload是Apache commons众多开源组件中的一员。可以从Apache网站中进行下载:
注意:虽然编码过程只用到:commons-fileupload-1.3.2.jar包,但是运行过程必须用到commons-io-2.5.jar包,两者缺一不可!
将这两个包放到/WEB-INF/lib下。
UploadServlet的源码如下:
package com.hello.firstweb; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.List; import org.apache.commons.io.IOUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; public class UploadServlet extends HttpServlet { /** * Constructor of the object. */ public UploadServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.getWriter().println("请以POST方式上传文件"); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file1 = null , file2 = null; String description1 = null,description2=null; response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); //输出到客户端浏览器 out.println("<HTML>"); out.println("<meta http-equiv=\"content-type\" content=\"text/html\";charset=\"UTF-8\">"); DiskFileUpload diskFileUpload = new DiskFileUpload(); //解析request try{ List<FileItem> list = diskFileUpload.parseRequest(request); out.println("遍历所有的 FileItem ...<br/>"); for(FileItem fileItem:list){ if(fileItem.isFormField()){ if("description1".equals(fileItem.getFieldName())){ out.println("遍历到 description1...<br/>"); description1 = new String(fileItem.getString().getBytes(),"UTF-8"); } if("description2".equals(fileItem.getFieldName())){ out.println("遍历到 description2...<br/>"); description2 = new String(fileItem.getString().getBytes(),"UTF-8"); } } else{ if("file1".equals(fileItem.getFieldName())){ File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8")); out.println("遍历到file1...<br/>"); out.println("客户端文件位置: "+remoteFile.getAbsolutePath()+"<br/>"); //服务器端文件,放在upload文件夹下面 file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName()); file1.getParentFile().mkdirs(); //创建文件夹路径 file1.createNewFile(); //创建新文件 InputStream ins = fileItem.getInputStream(); //FileItem的内容 OutputStream ous = new FileOutputStream(file1); //输出到file1中 try{ byte[] buffer = new byte[1024]; //缓冲字节 int len = 0; while((len = ins.read(buffer))>-1) ous.write(buffer, 0, len); out.println("已保存文件"+file1.getAbsolutePath()+"<br/>"); }finally{ ous.close(); ins.close(); } } if("file2".equals(fileItem.getFieldName())){ File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8")); out.println("遍历到file2...<br/>"); out.println("客户端文件位置: "+remoteFile.getAbsolutePath()+"<br/>"); //服务器端文件,放在upload文件夹下面 file2 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName()); file2.getParentFile().mkdirs(); //创建文件夹路径 file2.createNewFile(); //创建新文件 InputStream ins = fileItem.getInputStream(); //FileItem的内容 OutputStream ous = new FileOutputStream(file2); //输出到file1中 try{ byte[] buffer = new byte[1024]; //缓冲字节 int len = 0; while((len = ins.read(buffer))>-1) ous.write(buffer, 0, len); out.println("已保存文件"+file2.getAbsolutePath()+"<br/>"); }finally{ ous.close(); ins.close(); } } } }out.println("Request 解析完毕"); }catch (FileUploadException e){} if(file1!=null){ //输出file1链接 out.println("<div class = 'line'>"); out.println(" <div align='left' class='leftDiv'>file1:</div>"); out.println(" <div align='left' class='rightDiv'>"); out.println(" <a href='"+request.getContextPath()+"/attachment/"+file1.getName()+"' target=_blank>"+file1.getName()+"</a>"); out.println(" </div>"); out.println(" </div>"); } if(file2!=null){ //输出file1链接 out.println("<div class = 'line'>"); out.println(" <div align='left' class='leftDiv'>file1:</div>"); out.println(" <div align='left' class='rightDiv'>"); out.println(" <a href='"+request.getContextPath()+"/attachment/"+file2.getName()+"'target=_blank>"+file2.getName()+"</a>"); out.println(" </div>"); out.println(" </div>"); } out.println("<div class = 'line'>"); out.println(" <div align='left' class='leftDiv'>description1:</div>"); out.println(description1); out.println("</div>"); out.println("</div>"); out.println("</HTML>"); out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }