文件上传
文件上传前端页面:
- 使用 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 {@Overrideprotected 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 {@Overrideprotected 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 进行测试,结果如下:
