有一种常见的需求,当我们点击一个连接的时候,他会弹出来一个下载窗口,如下:
接下来我们就用Java语言,Tomcat服务器来实现这种需求。
首先,我们需要把图片放到web下的一个img文件夹下面,这就是图片资源路径。
接下来我们创建一个WebServlet,名字就叫DownloadServlet,让它继承HttpServlet,实现里面的doPost方法即可,doGet方法直接也写成调用doPost方法。doPost方法有以下步骤:
通过request获取参数文件路径
1
String fileName = request.getParameter("fileName");//获取request里面的fileName参数值
获取服务器文件流
1
2
3ServletContext servletContext = this.getServletContext();//获取getServletContext对象
String realPath = servletContext.getRealPath("/img/" + fileName);//根据fileName,调用servletContext的getRealPath方法,获取服务器的下载文件路径
FileInputStream fis = new FileInputStream(realPath);//设置字节流,读取文件设置响应头
1
2response.setHeader("Content-Type",servletContext.getMimeType(fileName));//获取并设置文件类型,如jpg形式,text/html形式等等
response.setHeader("Content-Disposition", "attachment;filename="+fileName);//这个就是告知我们是要下载文件,而不是预览文件,fileName为下载时提示保存文件名写到输出流中
1
2
3
4
5
6
7ServletOutputStream os = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while ((len = (fis.read(bytes))) != -1) {
os.write(bytes, 0 , len);
}
fis.close();
以上就完成了,我们在a标签里href设置为/DownloadServlet?fileName=qq.ico
时,运行起来Tomcat,打开浏览器,点击a标签,就会弹出来下载的提示了。
但是这样还有一个问题就是如果名字有中文的话会出现乱码情况,我们还需设置这一问题。
首先我们新建一个utils包,创建一个名字为DownLoadUtils
的java文件,文件内容如下:
1 | import java.io.UnsupportedEncodingException; |
再回到我们的DownloadServlet文件中,在设置响应头设置Content-Type
后、设置Content-Disposition
前,添加下面两行代码即可:
1 | //解决下载是名称中文乱码问题 |
这样设置完成之后就大功告成,这样如果名字带有中文的话,它也能正常显示出来了。
最后再附上github
地址。