文件上传与下载可谓上网中的常见现象。apache为我们准备了用于文件上传与下载的两个jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar)。我们在web项目中,将这两个jar包添加依赖,就可以使用客户端上传文件、服务器端下载文件的功能。
我们假设一个前端页面(如jsp页面)向服务器发起一个上传文件的请求,这时,表单必须必须用POST方式提交,设置表单提交格式为enctype="multipart/form-data",表示表单将能够提交字节数据,而不是键值对;服务器获取数据的时候,就不能request.getParameter了,必须用流获取;我们在服务器端用工具类库,对接收到的数据进行解析分析,及文件转储。
前端页面的表单如下:
接下来是处理文件上传与下载的核心工具类:
import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileItemFactory;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.IOException;import java.util.Iterator;import java.util.List;/** * 处理文件上传与下载 */@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")public class UploadServlet extends HttpServlet { private String dirPath=null; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //处理中文文件名乱码 request.setCharacterEncoding("UTF-8"); genUploadDir(request);//创建文件上传的根目录 // 检查前端发来的请求是否文件上传请求 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { //符合文件上传的要求,则进行文件的解析和转储 // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request try { Listitems = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { //如果是一个普通表单域 processFormField(item); } else { //如果是文件域 processUploadedFile(item); } } response.getWriter().write("successful"); } catch (FileUploadException e) { e.printStackTrace(); } } } //创建我们文件上传的根目录 private void genUploadDir(HttpServletRequest request) { if (dirPath==null) { dirPath =request.getServletContext().getRealPath("/WEB-INF/upload/"); File dir=new File(dirPath); //如果根目录不存在 if (!dir.exists()) { //则新建该文件夹 dir.mkdirs(); } } } private void processUploadedFile(FileItem item) { String fieldName = item.getFieldName(); System.out.println("fieldName = " + fieldName); String fileName = item.getName(); System.out.println("fileName = " + fileName); long sizeInBytes = item.getSize(); System.out.println("sizeInBytes = " + sizeInBytes); File uploadedFile = new File(dirPath,fileName); try { item.write(uploadedFile); } catch (Exception e) { e.printStackTrace(); } } private void processFormField(FileItem item) { String name = item.getFieldName(); System.out.println("name = " + name); String value = item.getString(); System.out.println("value = " + value); System.out.println("======================================"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}
在idea中运行tomcat服务器后,在前端表单中填入数据与上传的文件,服务器控制台显示文件上传成功:
键值对数据name = in_data1value = helloworld======================================上传文件数据fieldName = uploadFilefileName = JVM指令.txtsizeInBytes = 28733