文件上传
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 }
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 }
文件下载
新建DownloadServlet继承HtttpServlet(并配置web.xml)
1 package com.gychen.servlet; 2 3 import org.apache.commons.io.IOUtils; 4 import sun.misc.BASE64Encoder; 5 6 import javax.servlet.ServletContext; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import java.io.IOException; 12 import java.io.InputStream; 13 import java.io.OutputStream; 14 import java.net.URLEncoder; 15 import java.util.Base64; 16 17 public class DownloadServlet extends HttpServlet { 18 @Override 19 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 21 //1、获取要下载的文件名 22 String downloadFileName = "1.gif"; 23 24 //2、读取要下载的文件内容(通过ServletContext对象可以读取) 25 ServletContext servletContext = getServletContext(); 26 27 //获取要下载的文件类型 28 String mimeType = servletContext.getMimeType("/file/"+downloadFileName); 29 // System.out.println("下载的文件类型:"+mimeType); 30 31 //在回传前,通过响应头告诉客户端返回的数据类型 32 resp.setContentType(mimeType); 33 34 /* 35 还要告诉客户端收到的数据是用于下载使用(使用响应头) 36 Content-Disposition表示收到的数据怎么处理 37 attachment表示附件,filename表示下载时命名的文件名(允许与源文件名不同) 38 filename命名有中文时必须对文件名进行URL编码,其中火狐浏览器不支持URL编码,支持Base64编码 39 */ 40 41 if(req.getHeader("User-Agent").contains("Firefox")){ 42 //如果是火狐浏览器,使用BASE64编码 43 resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?" 44 + new BASE64Encoder().encode("你好.gif".getBytes("UTF-8"))+"?="); 45 }else{ 46 //如果是其他浏览器,使用URL编码 47 resp.setHeader("Content-Disposition","attachment;filename=" 48 + URLEncoder.encode("你好.gif","UTF-8")); 49 } 50 51 52 /** 53 * /斜杆被服务器解析表示地址为http://ip:port/工程名/ 映射到代码web目录 54 */ 55 //这里发不能有二级文件夹(即不能"/file/download/"),暂没深究。 56 InputStream resourceAsStream = servletContext.getResourceAsStream("/file/"+downloadFileName); 57 58 //获取响应的输出流 59 OutputStream outputStream = resp.getOutputStream(); 60 61 // //3、把下载的文件内容回传给客户端 62 // //读取输入流中全部的数据,复制给输出流,输出给客户端 63 IOUtils.copy(resourceAsStream,outputStream); 64 } 65 }