文件上传下载
1、文件的上传
Ⅰ、要有一个form标签,method=post请求。
Ⅱ、form标签的encType属性值必须是multipart/form-data值。
Ⅲ、在form标签使用input type=file添加上传的文件。
Ⅳ、编写服务器代码(Servlet程序)接收,处理上传的数据。
encType=multipart/form-data表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
新建upload.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>upload</title> 5 </head> 6 <body> 7 <form action="http://localhost:8080/EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data"> 8 用户名:<input type="text" name="username" id="username"><br /> 9 头像:<input type="file" name="photo" id="photo"><br /> 10 <input type="submit" value="上传"> 11 </form> 12 </body> 13 </html>
新建UploadServlet程序(并在web.xml中配置Servlet程序)
1 package com.gychen.servlet; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.ServletInputStream; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 10 public class UploadServlet extends HttpServlet { 11 12 /** 13 * 处理文件上传的数据 14 * @param req 15 * @param resp 16 * @throws ServletException 17 * @throws IOException 18 */ 19 @Override 20 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 22 System.out.println("文件已上传"); 23 ServletInputStream inputStream = req.getInputStream(); 24 byte[] buffer = new byte[1024000]; 25 int read = inputStream.read(buffer); 26 System.out.println(new String(buffer,0,read)); 27 } 28 }UploadServlet
2、服务器解析上传文件
Ⅰ、导入两个jar包
Ⅱ、两个jar包中的常用类
ServletFileUpload类,用于解析上传的数据。
FileItem类,表示每一个表单项。
3、fileupload类库的使用
1 package com.gychen.servlet; 2 3 import org.apache.commons.fileupload.FileItem; 4 import org.apache.commons.fileupload.FileItemFactory; 5 import org.apache.commons.fileupload.FileUploadException; 6 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 7 import org.apache.commons.fileupload.servlet.ServletFileUpload; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.ServletInputStream; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import java.io.File; 15 import java.io.IOException; 16 import java.util.List; 17 18 public class UploadServlet extends HttpServlet { 19 20 /** 21 * 处理文件上传的数据 22 * @param req 23 * @param resp 24 * @throws ServletException 25 * @throws IOException 26 */ 27 @Override 28 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 29 30 31 //判断上传的数据是否为多段数据(只有是多段数据才是文件上传的) 32 if(ServletFileUpload.isMultipartContent(req)){ 33 //创建FileItemFactory工厂实现类 34 FileItemFactory fileItemFactory = new DiskFileItemFactory(); 35 //创建用于解析上传数据的工具类ServletFileUpload 36 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); 37 //解析上传的数据,得到每一个表单项FileItem 38 try { 39 List<FileItem> list = servletFileUpload.parseRequest(req); 40 //循环判断每一个表单项是普通类型还是上传的文件 41 for(FileItem fileItem : list){ 42 if(fileItem.isFormField()){ 43 //普通表单项 44 System.out.println("表单项的name属性值:"+fileItem.getFieldName()); 45 //参数utf-8,解决乱码问题 46 System.out.println("表单项的value值:"+fileItem.getString("utf-8")); 47 }else{ 48 //上传的文件 49 System.out.println("文件的name属性值:"+fileItem.getFieldName()); 50 System.out.println("文件的文件名:"+fileItem.getName()); 51 //把文件写入磁盘 52 fileItem.write(new File("D:\\MyStudy\\" + 53 "SpringBootStudy\\JavaWebStudy\\EL&JSTL\\" + 54 "web\\file\\upload\\"+fileItem.getName())); 55 } 56 } 57 } catch (Exception e) { 58 e.printStackTrace(); 59 } 60 } 61 }UploadServlet