13.文件上传下载
一、文件上传
- 文件上传就是将本地的文件以流的形式上传到远程服务器上
- 文件上传的表单的要求
- 1)必须发送POST请求,即form表单的method属性值必须是post
- 2)form表单的enctype的值必须是multipart/form-data
- 3)上传文件的表单项的的type属性值为file
- 在Servlet中获取文件的信息不能按照正常的获取请求参数的方式获取,需要借助于其他工具
- FileUpload是Apache给我们提供的专门用来进行文件上传和下载的工具,使用它需要导入以下两个jar包
- commons-fileupload-1.3.1.jar
- commons-io-2.5.jar
- 涉及的核心类
- DiskFileItemFactory
- ServletFileUpload
- FileItem
- 文件下载的代码
package com.atguigu.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
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.List;
import java.util.UUID;
@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
DiskFileItemFactory itemFactory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(itemFactory);
fileUpload.setFileSizeMax(100*1024);
fileUpload.setSizeMax(200*1024);
try {
List<FileItem> fileItems = fileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
boolean formField = fileItem.isFormField();
if(formField){
String desc = fileItem.getString("UTF-8");
System.out.println("对文件的描述信息是:"+desc);
String fieldName = fileItem.getFieldName();
System.out.println("文本框的name属性值是:"+fieldName);
}else{
String name = fileItem.getName();
String contentType = fileItem.getContentType();
long size = fileItem.getSize();
System.out.println("文件名是:"+name);
System.out.println("文件的类型是:"+contentType);
System.out.println("文件的大小是:"+size+"个字节");
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath("/upload");
File file = new File(realPath);
if(!file.exists()){
file.mkdirs();
}
String prefix = UUID.randomUUID().toString();
fileItem.write(new File(realPath+"/"+prefix+"_"+name));
response.sendRedirect(request.getContextPath()+"/success.jsp");
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
request.setAttribute("msg","当个文件的大小不能超过100KB");
request.getRequestDispatcher("/index.jsp").forward(request,response);
e.printStackTrace();
} catch (FileUploadBase.SizeLimitExceededException e) {
request.setAttribute("msg","总文件的大小不能超过200KB");
request.getRequestDispatcher("/index.jsp").forward(request,response);
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
二、文件下载
- 文件下载只需要将要下载的文件在服务器端的路径设置到超链接中,点击即可下载,但是如果浏览器支持要下载的文件的格式将不再下载,直接打开
- 通常我们将要下载的文件放到WEB-INF目录下,然后通过向Servlet发送请求下载
- 文件下载的代码
package com.atguigu.servlet;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.net.URLEncoder;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
String fileName = "嗨皮.mp4";
fileName = URLEncoder.encode(fileName,"UTF-8");
String realPath = servletContext.getRealPath("/WEB-INF/download/happy.mp4");
InputStream is = new FileInputStream(realPath);
String mimeType = servletContext.getMimeType(realPath);
response.setContentType(mimeType);
response.setHeader("Content-Disposition","attachment; filename="+fileName);
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is,os);
is.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}