1、利用html标签直接指向服务器的资源:
工程结构:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>download</title> </head> <body bgcolor="aqua"> <h1>使用标签直接指向服务器上的资源</h1> <a href="/download_war_exploded/download/wenjian.txt"> wenjian.txt </a><br><br> <a href="/download_war_exploded/download/王强 - 秋天不回来.mp3"> 王强 - 秋天不回来.mp3 </a><br><br> <a href="/download_war_exploded/download/timg.jpg"> 丰收的季节 </a> </body> </html>
对于图片、文本等浏览器能够直接解析的文件,在浏览器内可以直接打开:
而对于歌曲、视频等浏览器不能解析的文件,需要下载:
实际运用中,需要下载的文件都需要编写文件下载代码。
2、文件的下载:
(1)html采用超链接的形式,点击后指向对应的Servlet,并设置了文件的名称属性,可以让Servlet知道要下载的是哪个文件:
<body bgcolor="aqua"> <h1>文件的下载</h1> <a href="/download_war_exploded/download?filename=wenjian.txt">wenjian.txt </a><br><br> <a href="/download_war_exploded/download?filename=q.mp3"> 王强 - 秋天不回来.mp3</a><br><br> <a href="/download_war_exploded/download?filename=timg.jpg">丰收的季节</a> </body>
(2)Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException { String filename=request.getParameter("filename");//获取html文件中的文件名 response.setContentType(this.getServletContext().getMimeType(filename));//获得要下载的文件的类型(MIME方式) response.setHeader("Content-Disposition","attachment;filename="+filename); //设置响应头,并告诉客户端不要进行解析而是下载 String path=this.getServletContext().getRealPath("download/"+filename); FileInputStream inputStream=new FileInputStream(path);//获取输入的文件路径 ServletOutputStream servletOutputStream=response.getOutputStream();//向客户端输出 byte[] buffer = new byte[1024];//缓冲数组 int len = 0; while ((len =inputStream.read(buffer))>0) { servletOutputStream.write(buffer, 0, len); // 将数组中的指定长度的数据写入到输出流中。 } inputStream.close(); servletOutputStream.close(); }
Servlet采用缓冲数组的方式,将服务端的数据输出到客户端,但是要告诉客户端不要解析文件。
(3)Servlet的配置:
<servlet> <servlet-name>ServletDownload</servlet-name> <servlet-class>pers.zhb.download.ServletDownload</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDownload</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping>
3、注意事项:
文件的名字不能带有中文,否则需要对字体的格式进行调整。