文件上传,说到底还是使用http协议。这里最主要是做两件事,一是客户端上传,二是服务器接收。
先说客户端上传:
在web页面中,使用form表单提交给服务器,注意form表单的input项中一定要写name属性,否则不会上传,还有一个form属性就是将
enctype属值设为multipart/form-data。如下
<form action="/fileUpload/servlet/fiveup" method="post" enctype="multipart/form-data"><br> 文件1:<input type="file" name="fileone"/><br> 文件2:<input type="file" name="filetwo"/><br> 文件3:<input type="file" name="filethree"/><br> 文件4:<input type="file" name="filetfour"/><br> 文件5:<input type="file" name="filefive"/><br> <input type="submit" value="上传"> </form>
好,客户端的用一个html页面写好就可以了。接下来说服务器端
服务器端使用servlet接收,这里我们使用Apache 开源组织提供的一个用来处理表单文件上传的一个开源组件( Commons-fileupload );使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。故先要导入两个jar包哟。好,看代码吧。代码中有涉及到Commons-fileupload API的使用,想要了解可以查看Apache Commons-fileupload的API文档。
基本步骤是这样的:
1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
package com.lam.upload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletContext; 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; public class FiveUp extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Configure a repository (to ensure a secure temp location is used) ServletContext servletContext = this.getServletConfig().getServletContext(); File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); factory.setRepository(repository); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("utf-8"); // Parse the request try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { if(item.isFormField()){//如果只是表单中信息,不是表单文件 String fieldName = item.getFieldName(); String fieldValue = item.getString(); out.print("<br>fieldName=="+fieldName+",--fieldValue=="+fieldValue); }else{ InputStream inputStream = item.getInputStream(); //得到保存文件的路径 String realpath=request.getRealPath("WEB-INF/fiveUpload"); File filedir =new File(realpath); if(!filedir.exists()){ filedir.mkdirs(); } //得到上传的文件的名字 String fileName = item.getName(); out.print("<br>上传的文件名:=="+fileName); File file=new File(realpath+"/"+fileName); // String saveName=realpath+"/"+fileName; FileOutputStream fos=new FileOutputStream(file); byte[] bytes= new byte[1024]; int len=0; //写入文件 while((len=inputStream.read(bytes))!=-1){ fos.write(bytes, 0, len); } inputStream.close(); fos.close(); out.print("<h1>"+fileName+"文件上传成功</h1>"); } } } catch (FileUploadException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
这里说一个需要注意的问题