Servlet实现文件下载
Servlet实现文件下载
下载资源我们在日常中也很常用,它是怎么做到的呢?要能够给别人下载,服务器就应该有这个资源
现在我web站点下有一些资源了
浏览器发送所有的请求都是去找Servlet的话,那么我就写一个Servlet,当访问这个Servlet的时候,就可以下载我这个图片资源了!
1、java的文件上传下载都是通过io流来完成的,既然要下载图片,首先要能够读取到,w它。(我这里是指定了具体了存储路径,然后从前端文件列表中将要下载文件的文件名传到ServletDownload,拿到文件具体路径,文件输入流读取资源)
//获取资源路径
String name= req.getParameter("fName");
System.out.println("name: "+name);//比如name=1.jpg
String path = this.getServletContext().getRealPath("/resource/"+name);
//文件输入流读取资源
FileInputStream fileInputStream = new FileInputStream(path);
//获取文件名
//substring() 方法返回字符串的子字符串。
//lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,
// 在一个字符串中的指定位置从后向前搜索
String fileName = path.substring(path.lastIndexOf("\\")+1);
告诉浏览器,我要下载这个文件
//设置消息头,告诉浏览器,我要下载1.png这个图片
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
3、将读取到的内容回送给浏览器
fileInputStream.read(byte [] b )
从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数,运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度.如果没有可用的字节,因为已经到达流的末尾, -1返回的值
int len = 0;
byte[] bytes = new byte[1024];
ServletOutputStream servletOutputStream = resp.getOutputStream();
while((len=fileInputStream.read(bytes))>0){
servletOutputStream.write(bytes, 0, len);
}
//关闭资源
servletOutputStream.close();
fileInputStream.close();
前端页面我假设这个资源名称都是知道的,很多时候我们都是从数据中获取资源相关信息,然后展示在页面,这里我偷懒就指定具体文件资源了。
点击要下载的指定文件,就会将文件名fName参数传到Servlet,进行读取下载。
如果我文件的名字是中文呢?
发现访问下载,可以下载,但是命名确是乱码,为了解决文件名乱码,我们要进行URL编码,代码如下:
//resp.setHeader("Content-Disposition", "attachment; filename="+fileName);
resp.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileName,"UTF-8"));
再次访问时,文件名乱码问题就解决了
“扫码关注“