### 文件上传下载 - 文件上传 - 客户端 1、input 的 type 设置为 file。 2、form 表单的 method 设置为 post(get 会将文件名传给后台,而非文件本身) 3、form 表单的 enctype 设置为 multipart/form-data (以二进制的形式传输数据) - 服务端 commons-fileupload,commons-io 基本思想:commons-fileupload 可以解析请求,得到一个泛型为 FileItem 的集合。 commons-fileupload 可以将所有的请求信息都解析成 FileItem 对象,无论是表单域还是文件域。 开发者就可以对 FileItem 集合进行操作,从而完成上传。 上传组件可以将传来的二进制数据解析成一个集合,进而方便开发。 ```jsp <%-- Created by IntelliJ IDEA. User: southwind Date: 2019-07-28 Time: 20:16 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/upload.do" enctype="multipart/form-data" method="post"> <input type="file" name="img"/> <input type="text" name="desc"/> <input type="submit" value="上传"/> </form> </body> </html> ``` ```java package com.southwind.controller; 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 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.*; import java.util.List; @WebServlet("/upload.do") public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException { //创建DiskFileItemFactory DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); //创建文件解析器 ServletFileUpload upload = new ServletFileUpload(fileItemFactory); //获取FileItem集合 try { List<FileItem> list = upload.parseRequest(req); //遍历list for (FileItem fileItem:list){ if(!fileItem.isFormField()){ String fileName = fileItem.getName(); try { InputStream inputStream = fileItem.getInputStream(); String path = req.getServletContext().getRealPath(""); OutputStream outputStream = new FileOutputStream(path+"/files/"+fileName); int temp = 0; while((temp=inputStream.read())!=-1){ outputStream.write(temp); } inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); } } } ``` - 文件下载 ```jsp <%-- Created by IntelliJ IDEA. User: southwind Date: 2019-07-28 Time: 21:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="/download.do">1.png</a> </body> </html> ``` ```java package com.southwind.controller; 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.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/download.do") public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("application/x-msdownload"); String fileName = "1.png"; resp.setHeader("Content-Disposition","attachment;filename="+fileName); OutputStream outputStream = resp.getOutputStream(); String path = req.getServletContext().getRealPath("")+"/files/"+fileName; InputStream inputStream = new FileInputStream(path); int temp = 0; while((temp = inputStream.read())!=-1){ outputStream.write(temp); } outputStream.close(); inputStream.close(); } } ```
download.jsp
<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-07-28 Time: 21:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="/download.do">1.png</a> <a href="/download.do">1.png</a> </body> </html>
upload.jsp
<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-07-28 Time: 20:16 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/upload.do" enctype="multipart/form-data" method="post"> <input type="file" name="img"/> <input type="text" name="desc"/> <input type="submit" value="上传"/> </form> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app>
DownloadServlet.java
package com.southwind.controller; 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.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/download.do") public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); resp.setContentType("application/x-msdownload"); String fileName = "1.png"; resp.setHeader("Content-Disposition","attachment;filename="+fileName); OutputStream outputStream = resp.getOutputStream(); String path = req.getServletContext().getRealPath("")+"/files/"+fileName; InputStream inputStream = new FileInputStream(path); int temp = 0; while((temp = inputStream.read())!=-1){ outputStream.write(temp); } outputStream.close(); inputStream.close(); } }
UploadServlet.java
package com.southwind.controller; 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 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.*; import java.util.List; @WebServlet("/upload.do") public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException { //创建DiskFileItemFactory DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); //创建文件解析器 ServletFileUpload upload = new ServletFileUpload(fileItemFactory); //获取FileItem集合 try { List<FileItem> list = upload.parseRequest(req); //遍历list for (FileItem fileItem:list){ if(!fileItem.isFormField()){ String fileName = fileItem.getName(); try { InputStream inputStream = fileItem.getInputStream(); String path = req.getServletContext().getRealPath(""); OutputStream outputStream = new FileOutputStream(path+"/files/"+fileName); int temp = 0; while((temp=inputStream.read())!=-1){ outputStream.write(temp); } inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); } } }