Servlet(七):文件上传和下载
一、文件上传
准备前台页面-准备后台代码
(一)准备前台页面
1. 准备表单
(1)设置表单提交类型POST
(2)设置表单编码类型multipart/form-data
(3)设置表单提交地址
2. 准备表单元素
(1)普通表单项,<input type="text" name="..."></input>
(2)文件表单项,<input type="file" name="..."></input>
(3)button提交,button的默认类型为submit
<form method="post" enctype="multipart/form-data" action="upload01">
请输入用户名:<input type="text" name="username"> <br>
请上传文件:<input type="file" name="myfile"> <br>
<button>提交</button>
</form>
(二)准备后台代码
1. 类定义行上@MultipartConfig
(1)标识该Servlet支持文件上传
(2)Servlet将multipart/form-data的post请求封装为Part对象,通过Part对象对上传的文件进行操作
(3)上传文件对应的part对象:获取文件名字、上传文件到后台的指定目录
2. 设置请求响应编码
(1)req.setCharacterEncoding("utf-8") //设置请求编码
(2)resp.setContentType("text/html;charset=utf-8") //设置响应编码
3. 通过普通表单项的name属性值,获取前台传递的参数
4. 通过获取文件表单项的name属性值,获取前台传递的文件
(1)获取part对象
req.getPart("文件表单项的name属性值")
(2)获取文件的名字:
part对象.getSubmittedFileName()
(3)获取文件的存放路径(放在项目资源路径下面)
req.getServletContext().getRealPath("/")
(4)上传文件到后台的指定目录:
part对象.write(realPath + submittedFileName)
@WebServlet("/upload01")
@MultipartConfig
public class Upload01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 1. 设置请求响应编码 */
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
/* 2. 通过普通表单项的name属性值,获取前台传递的参数 */
String username = req.getParameter("username");
System.out.println(username);
/* 3. 通过获取文件表单项的name属性值,获取前台传递的文件*/
//(1)获取part对象
Part myfile = req.getPart("myfile");
//(2)获取文件的名字
String submittedFileName = myfile.getSubmittedFileName();
System.out.println(submittedFileName);
//(3)获取文件的存放路径(放在项目资源路径下面)
String realPath = req.getServletContext().getRealPath("/");
//(4)上传文件到后台的指定目录
myfile.write(realPath + submittedFileName);
}
}
二、文件下载
(一)超链接下载
1. 遇见可识别的资源(如png),会进行跳转;可用download属性规定下载(不同浏览器不一定支持)
2. 遇见不识别的资源(如rar),会进行下载
3. 设置资源路径,浏览器才可访问到资源
(1)在web目录下新建download目录,用于存放服务器可下载资源
(2)设置资源路径
点击服务器的编辑配置,部署,点击“+”号,外部源,选择服务器可下载资源的存放目录,确定
点击应用程序上下文,将默认路径改为:/指定站点名/资源存放目录名,应用确定

(3)代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>download02</title>
</head>
<body>
<a href="download/01picture.png" >png跳转</a> <br>
<a href="download/02text.txt" >txt跳转</a> <br>
<a href="download/03.rar" >rar跳转</a> <br>
<a href="download/01picture.png" download>png下载</a> <br>
<a href="download/02text.txt" download>txt下载</a> <br>
<a href="download/03.rar" download>rar下载</a> <br>
</body>
</html>
(二)后台实现下载
准备前台页面-准备后台代码
1. 准备前台页面
<form method="post" action="download03">
<input type="text" name="filename" placeholder="请输入要下载的文件名">
<button>提交</button>
</form>
2. 准备后台代码
(1)设置请求响应编码
(2)获取文件名
(3)获取文件存放路径(项目资源真实路径)
(4)获取file对象
(5)文件下载三步走
①设置响应类型
②设置响应头
③读取下载文件
@WebServlet("/download03")
public class Download03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 1. 设置请求响应编码 */
req.setCharacterEncoding("utf-8");
resp.setContentType("txt/html;charset=utf-8");
/* 2. 获取文件名 */
String filename = req.getParameter("filename");
// 判断文件名是否非空,trim()去除字符串前后空格
if (filename == null || "".equals(filename.trim())) {
resp.getWriter().write("请输入文件名");
resp.getWriter().close();
return;
}
else {
/* 3. 获取文件存放路径(项目资源真实路径)*/
String realPath = req.getServletContext().getRealPath("/");
/* 4. 获取file对象 */
File file = new File(realPath + filename);
// 判断文件是否为标准文件(存在且不是目录)
if (file.exists() && file.isFile()) {
/* 5. 文件下载三步走 */
//1. 设置响应类型
resp.setContentType("application/x-msdownload");
//2. 设置响应头
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
//3. 读取下载文件
//得到file文件输入流
FileInputStream fileInputStream = new FileInputStream(file);
//得到字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
//定义byte数组
byte[] bytes = new byte[1024];
//定义长度
int length=0;
//循环输出
while ((length = fileInputStream.read(bytes)) != -1 ){
outputStream.write(bytes, 0, length);
}
//释放资源
fileInputStream.close();
outputStream.close();
}
}
}
}
更多推荐





所有评论(0)