本文主要是介绍13.文件的上传下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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;
//处理文件上传的Servlet
@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决POST请求请求中文乱码问题
request.setCharacterEncoding("UTF-8");
//获取用户的描述信息和文件信息
// String desc = request.getParameter("desc");
// String file = request.getParameter("file");
// System.out.println(desc);
// System.out.println(file);
//创建工厂对象
DiskFileItemFactory itemFactory = new DiskFileItemFactory();
//创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(itemFactory);
//限制单个文件的大小100KB
fileUpload.setFileSizeMax(100*1024);
//限制总文件的大小200KB
fileUpload.setSizeMax(200*1024);
try {
//解析请求
List<FileItem> fileItems = fileUpload.parseRequest(request);
/*
七个核心方法:
boolean isFormField():判断是否是普通表单项
String getString(String encoding):获取普通表单项中的文本值,调用方法时可以传入字符集
String getFieldName():获取name属性值
String getName():获取文件名
String getContentType():获取文件的类型,是一个MIME值
long getSize():获取文件的大小,单位是字节
void write(File var1):将文件写到服务器
*/
//遍历得到每一个表单项
for (FileItem fileItem : fileItems) {
//判断是否是普通表单项
boolean formField = fileItem.isFormField();
if(formField){
//是普通表单项
//获取文本框中输入的内容
String desc = fileItem.getString("UTF-8");
System.out.println("对文件的描述信息是:"+desc);
//获取文本框的name属性值
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+"个字节");
//将文件写到本地
// fileItem.write(new File("E:/"+name));
//需求:将文件上传到服务器中项目的upload目录中
//获取ServletContext对象
ServletContext servletContext = request.getServletContext();
//获取upload目录在服务器端的真实路径
String realPath = servletContext.getRealPath("/upload");
//判断服务器中upload目录是否存在,如果不存在,自动创建它
File file = new File(realPath);
if(!file.exists()){
//创建目录
file.mkdirs();
}
//给上传的每一个文件通过UUID添加一个前缀
String prefix = UUID.randomUUID().toString();
//将文件上传到upload目录中
fileItem.write(new File(realPath+"/"+prefix+"_"+name));
//重定向到上传成功的页面
response.sendRedirect(request.getContextPath()+"/success.jsp");
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
//设置一个提示信息并放到request域中
request.setAttribute("msg","当个文件的大小不能超过100KB");
//转发到首页
request.getRequestDispatcher("/index.jsp").forward(request,response);
e.printStackTrace();
} catch (FileUploadBase.SizeLimitExceededException e) {
//设置一个提示信息并放到request域中
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;
//处理文件下载的Servlet
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取ServletContext
ServletContext servletContext = request.getServletContext();
//设置要下载的文件的名称
String fileName = "嗨皮.mp4";
//对中文名使用URLEncoder进行编码
fileName = URLEncoder.encode(fileName,"UTF-8");
//获取要下载的资源在服务器端的真实路径
String realPath = servletContext.getRealPath("/WEB-INF/download/happy.mp4");
//1.创建一个输入流
InputStream is = new FileInputStream(realPath);
//2.设置两个响应头
//1)设置要下载的文件的MIME类型
//获取要下载的资源的MIME类型
String mimeType = servletContext.getMimeType(realPath);
//方式一:
// response.setHeader("Content-Type",mimeType);
//方式二:
response.setContentType(mimeType);
//2)设置让浏览器如何处理该资源
response.setHeader("Content-Disposition","attachment; filename="+fileName);
//3.获取输出流
ServletOutputStream os = response.getOutputStream();
//4.复制流
IOUtils.copy(is,os);
//5.关闭流
is.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
这篇关于13.文件的上传下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!