对于一般的文件直接用 a 标签的话,如下代码所示。由于浏览器可以解析jpg和txt文件,故不会直接下载而是在其他网页打开:
<a href="/IT/download/1.gif" rel="nofollow">下载图片</a>
<a href="/IT/download/day10.doc" rel="nofollow">下载文档</a>
<a href="/IT/download/day10.txt" rel="nofollow">下载笔记</a>
如果想要完成直接下载的目的,可以通过Servlet进行操作,做了一个简单的html页面
<a href="/IT/download?name=1.gif" rel="nofollow">下载图片1</a>
<a href="/IT/download?name=day10.doc" rel="nofollow">下载文档1</a>
<a href="/IT/download?name=day10.txt" rel="nofollow">下载笔记1</a>
我为download注册了一个servlet,xml描写如下:
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.response.download.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
由于我的请求方式是get方式,所以只需在DownloadServlet这个类中重写doGet方法,代码实现如下:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取文件名
String filename=request.getParameter("name");
//防止读取name名乱码
filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
//在控制台打印文件名
System.out.println("文件名:"+filename);
//设置文件MIME类型
response.setContentType(getServletContext().getMimeType(filename));
//设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获取要下载的文件绝对路径,我的文件都放到WebRoot/download目录下
ServletContext context=this.getServletContext();
String fullFileName=context.getRealPath("/download/"+filename);
//输入流为项目文件,输出流指向浏览器
InputStream is=new FileInputStream(fullFileName);
ServletOutputStream os =response.getOutputStream();
/*
* 设置缓冲区
* is.read(b)当文件读完时返回-1
*/
int len=-1;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1){
os.write(b,0,len);
}
//关闭流
is.close();
os.close();
}