Servlet的应用(三):文件下载
一:项目的框架
二:Web前端设计部分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>downlod01页面</title> </head> <body> <!-- 注意name后面最好不要有空格 不然在servlet页面读取数据的时候会把空格读进去 导致文件路径有问题--> <a href="download01?name=b.ico">下载b站图标</a><br> <a href="download01?name=car.jpg">下载奔驰图标</a> </body> </html>
效果如下:
注意: HTML 中 a标签与Servlet绑定的方式是通过href的值进行绑定的
form表单是通过action的值来进行绑定的
三:Servlet设计部分
package com.whx.servlet; 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.net.URLEncoder; @WebServlet(value = "/download01", name = "DownLoadServlet") public class DownLoadServlet extends HttpServlet { //定义文件下载的目录的路径 private String resourceLocation ="E:\\nginx\\nginx-1.17.2\\html\\"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取从html页面标注的name的信息 String name = req.getParameter("name"); //获取输入流 FileInputStream is = new FileInputStream(resourceLocation + name); //处理中文文件下载的时候,浏览器显示中文的乱码问题 String cnFileName = URLEncoder.encode(name, "utf-8"); //下载需要设置头信息,这是一种固定的模式 resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName); //获取输出流 ServletOutputStream os = resp.getOutputStream(); //在读入数据的时候,同时把数据输出到客户端的html上 int length=0; byte[] bs =new byte[2048]; while (-1 !=(length = is.read(bs))){ os.write(bs,0,length); } os.flush(); os.close(); is.close(); } }
四:注意事项
(1)HTML:
1.HTML中的a标签的href参数是用来绑定相关的servlet的,所以一定要和servlet中注解的值一样
2. a标签中href中值的写法:
name的值会在servlet中被读取,和保存文件的目录拼起来构成下载的绝对路径
<a href="download01?name=b.ico">下载b站图标</a><br> <a href="download01?name=car.jpg">下载奔驰图标</a>
(2)Servlet:
1.在下载操作中,注解只需要一个,即:@WebServlet(参数) 而不需要@MutipartConfig
2.与上传文件操作固定要先获取文件的头信息这一步骤相对应,在下载操作中,需要固定地先设置头信息,这也是一种固定的模式
//下载需要设置头信息,这是一种固定的模式 resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName);
3.流的获取问题
在下载操作中,输出流的获取是通过resp来获取的:
//获取输出流 ServletOutputStream os = resp.getOutputStream();
而在上传操作中,输入的获取是通过Part类对象来获取的:
// 利用part获取文件的输入流 InputStream is = part.getInputStream();
4.编码问题
如果下载的文件的文件名包含中文的话,有可能会出现编码问题,对此我们的解决方法是对文件名进行处理:
//处理中文文件下载的时候,浏览器显示中文的乱码问题 String cnFileName = URLEncoder.encode(name, "utf-8");
推荐阅读
-
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
-
SpringMVC + servlet3.0 文件上传的配置和实现代码
-
RxJava2.x+ReTrofit2.x多线程下载文件的示例代码
-
php下载文件超时时间的设置方法
-
使用Android系统提供的DownloadManager来下载文件
-
配置SVN服务器多库(每个库有自己的文件夹) 博客分类: 应用 SVNsubversionWindowsBlog.net
-
应用Java泛型和反射导出CSV文件的方法
-
ASP.NET 在下载文件时对其重命名的思路及实现方法
-
Java追加文件内容的三种方法实例代码
-
Android应用程序中读写txt文本文件的基本方法讲解