文件上传
文件上传前端页面:
- 使用 form 标签,请求方式为 post
- form 的 enctype 设置为 multipart/form-date,即设置表单的类型为文件上传表单(form 表单的默认类型为 application/x-www-form-urlencoded)
- 文件标签设置 name 属性值
前台页面:
<form method="post" enctype="multipart/form-data" action="/upload">
文件名:<input type="text" name="filename"><br/>
文件:<input type="file" name="file"><br/>
<button type="submit">上传</button>
</form>
后台服务端:使用注解 @MultipartConfig 将一个 Servlet 标识为文件上传,Servlet 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作
@MultipartConfig // 文件上传表单
@WebServlet("/upload")
public class UpLoad extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的编码格式
request.setCharacterEncoding("UTF-8");
// 获取普通表单项(文本框)
String filename = request.getParameter("filename");
// 通过getPart(name)方法获取Part对象(name代表的是页面中file文件域的name属性值)
Part part = request.getPart("file");
// 通过Part对象,获取上传的文件名
String fileName = part.getSubmittedFileName();
// 获取上传文件需要存放的位置(得到项目存放的真实路径)
String realPath = request.getServletContext().getRealPath("/");
// 将文件上传到指定位置
part.write(realPath + fileName);
}
}
文件下载
文件下载,即将服务器上的资源下载(拷贝)到本地,可以通过两种方式下载:
- 超链接进行下载
- 通过代码下载
1、超链接下载:在html或jsp页面中使用 a 标签时,当超链接遇到浏览器不识别的资源时会自动下载,也可以使用download属性规定浏览器进行下载
<a href="test.zip">超链接下载</a>
<!-- 使用download属性指定:download不写任何信息时,使用默认文件名,设置了值时,使用设置的值作为文件名 -->
<a href="test.zip" download>超链接下载</a>
2、后台实现下载:
- 通过 response.setContentType 方法设置 Content-type 头字段的值,为浏览器无法使用某种方式激活某个程序来处理的MIME类型,例如application/octet-stream 或 application/x-msdownload 等
- 需要通过 response.setHeader 方法设置 Content-Disposition 头的值为 attachment;filename=文件名
读取下载文件,调用 response.getOutputStream 方法向客户端写入附件内容
@WebServlet("/download")
public class Download extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求的编码
request.setCharacterEncoding("UTF-8");
// 获取文件下载路径
String path = this.getServletContext().getRealPath("/");
// 获取要下载的文件名
String name = request.getParameter("filename");
// 通过路径得到file对象
File file = new File(path + name);
// 判断file对象是否存在,且是否一个标准文件
if (file.exists() && file.isFile()) {
// 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的类型)
response.setContentType("application/x-msdownload");
// 设置头信息
response.setHeader("Content-Disposition",
"attachment;filename=" + name);
// 得到输入流
FileInputStream fis = new FileInputStream(file);
// 得到输出流
ServletOutputStream os = response.getOutputStream();
// 定义byte数组
byte[] bytes = new byte[1024];
int read = 0;
while ((read = fis.read(bytes)) != -1) {
os.write(bytes, 0, read);
}
// 冲刷输出流
os.flush();
fis.close();
os.close();
}
}
}
通过在浏览器输入以下访问地址:127.0.0.1:8080/download?filename=文件名 就能实现下载
使用 cmd 的 cURL 进行测试,结果如下: