首先导入jar包 Commons-fileupload.jar & commons-io.jar
目录
文件的上传
文件的下载
文件的上传
- 方法介绍
isMultipartContent(request) 静态方法 判断表单上传的编码是否是以二进制多段形式上传 ServletFileUpload.parseRequest(req) 解析表单中的每一个表单项,封装成FileItem对象,以List方式返回 isFormField() 判断filtItem是否为普通表单 普通(true),file表单(false) fileItem.getFieldName 获取表单属性名 fileItem.getString() 获取表单属性值 fileItem.getName() 获取文件名
- 方法实现
<%-- Created by IntelliJ IDEA. User: 71747 Date: 2023-11-04 Time: 19:01 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> <%-- 文件上传 enctype 一种将数据回发到服务器时浏览器使用的编码类型 input:file类型 1.要有一个form标签,method=post请求 2.form标签的enType属性必须为mutipart/form-data值 3.在form标签中使用input type=file添加上传的文件 4.编写服务器代码接收,处理上传的数据。 --%> <form method="post" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"/><br/> 昵称:<input type="text" name="nickNmae"/><br/><br/> 上传的文件(支持.jpg/.gif/.png图片格式):<br/><input type="file" name="myfile"/> <input type="submit" value="点击上传"/> </form> </body> </html>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=UTF-8");
//1.创建解析工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.创建解析器对象
ServletFileUpload sfu = new ServletFileUpload(factory);
//3.判断表单上传的编码是否为二进制
if (ServletFileUpload.isMultipartContent(req)) {//二进制 true
//4.解析上传的内容
try {
List<FileItem> fs = sfu.parseRequest(req);//解析表单中的每一个表单项,封装成FileItem对象,以List方式返回
for (FileItem f : fs) {
if (f.isFormField()) {//普通表单元素
//获得普通表单的name属性名
String name = f.getFieldName();
//获得普通表单的value属性值
String value = f.getString("utf-8");
System.out.println("普通表单name="+name+",value="+value);
}else {//文件表单元素
//获得原文件名
String fileName = f.getName();
if (fileName.endsWith(".jpg")||fileName.endsWith(".gif")||fileName.endsWith(".png")) {
//获得上传后文件夹的路径(getServletContext():servletcontext对象 getRealPath(""):获取给定的文件在服务器上面的绝对或相对(与参数有关)路径)
String path = req.getServletContext().getRealPath("WEB-INF/upload");
//将文件夹地址转化为文件对象
File filePath = new File(path);
if (filePath.isDirectory()&&!filePath.exists()) {//是文件夹但是未被创建
filePath.mkdirs();
}
//为防止同名文件后来的将先前的覆盖,将文件名重写(源文件名就是将来上传文件名#后的内容)
fileName = UUID.randomUUID().toString()+System.currentTimeMillis()+fileName.substring(fileName.lastIndexOf("."));
//上传文件
f.write(new File(filePath, fileName));
resp.getWriter().write("上传成功!");
}else {
resp.getWriter().write("上传文件格式有误,只支持.jpg,.gif,.png图片格式");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}else {
resp.getWriter().write("你上传的文件编码有误");
}
}
文件的下载
<%--
Created by IntelliJ IDEA.
User: 71747
Date: 2023-11-04
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>
<%--文件下载--%>
<form action="${pageContext.request.contextPath}/download" method="post">
<input type="submit" value="下载文件">
</form>
</body>
</html>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//要下载的文件名
String downloadFileName = "test.jsp";
//获取ServletContext对象
ServletContext servletContext = getServletContext();
//获取该文件类型
String mimeType = servletContext.getMimeType("WEB-INF/upload/" + downloadFileName);//传入文件地址
//设置下载的文件类型
resp.setContentType(mimeType);
//获取输入输出流
InputStream is = servletContext.getResourceAsStream("WEB-INF/upload/" + downloadFileName);//传入文件地址
ServletOutputStream os = resp.getOutputStream();
//设置响应形式
//attachment:表示以附件方式下载,如果要在页面中打开,可以改为inline.
if (req.getHeader("User-Agent").contains(" Firefox")) {//火狐浏览器
resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode("中国.jpg".getBytes(StandardCharsets.UTF_8)) + "?=");
} else {
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
}
//读写操作
IOUtils.copy(is, os);
}