一、文件上传知识简介
1、文件上传和下载的实质:文件的拷贝
2、文件上传:从本地拷贝到服务器磁盘上 客户端需要编写文件上传表单---->服务端需要编写代码接受上传的 文件
3、文件下载:从服务器磁盘上拷贝到本地磁盘 需要编写服务端的代码,客户端的下载的工作浏览器内核解决的
4、文件上传的步骤:
1) 、需要写一个文件上传表单
2)、 编写服务器端的代码用于接收上传的文件
5、注意事项:
做文件上传时客户端需要满足的三个条件
1)、提交方式必须是post方式提交 即:method="post"。
2)、文件类型的input标签必须要有name属性
3)、form表单必须是一个多部分表单即:enctype="multipart/form-data"
6、使用方便快捷的文件上传的工具---Apache Commons-fileupload.jar
7、FileUpload工具中三个核心的对象
1)、DiskFileItemFactory:磁盘文件项工厂--一些相关的配置的设置 缓存的大小 临时目录的位置
2)、ServletFileUplaod:文件上传的一个核心类
3)、FileItem:代表每一个表单项
二、文件上传的原理分析
三、文件上传的API的详解
四、代码
1、简单界面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="upload" method="post" enctype="multipart/form-data"> <input type="text" name="username"><br> <input type="file" name="filename"><br> <input type="submit" value="上传文件"> </form> </body> </html>
2、servlet
package com.me.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; 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 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.IOUtils; @WebServlet("/upload") public class FileuplodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public FileuplodeServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //1、创建磁盘文件项工厂 //作用:设置缓存文件的大小 设置临时文件存储的位置 String path_temp = this.getServletContext().getRealPath("temp"); //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp)); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024*1024); factory.setRepository(new File(path_temp)); //2、创建文件上传的核心类 ServletFileUpload upload = new ServletFileUpload(factory); //设置上传文件的名称的编码 upload.setHeaderEncoding("UTF-8"); //ServletFileUpload的API boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单 if(multipartContent){ //是文件上传的表单 //***解析request获得文件项集合 List<FileItem> parseRequest = upload.parseRequest(request); if(parseRequest!=null){ for(FileItem item : parseRequest){ //判断是不是一个普通表单项 boolean formField = item.isFormField(); if(formField){ //username=zhangsan String fieldName = item.getFieldName(); String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码 System.out.println(fieldName+"----"+fieldValue); //当表单是enctype="multipart/form-data"时 request.getParameter相关的方法 //String parameter = request.getParameter("username"); }else{ //文件上传项 //文件的名 String fileName = item.getName(); //获得上传文件的内容 InputStream in = item.getInputStream(); String path_store = this.getServletContext().getRealPath("upload"); OutputStream out = new FileOutputStream(path_store+"/"+fileName); IOUtils.copy(in, out); in.close(); out.close(); //删除临时文件 item.delete(); } } } }else{ //不是文件上传表单 //使用原始的表单数据的获得方式 request.getParameter(); } } catch (FileUploadException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
五、运行测试