通过超链接提供下载的缺点:
在点击页面上的超链接的时候,只有2.rar和4.ppt 连接会弹出下载提示。
而其他的连接都会直接在 浏览器中打开需要下载的文件。
由于1.jpg 、1.txt文件是浏览器可以直接识别的并且能够显示的数据,这时浏览器直接把这些数据打开显示了 。而zip压缩文件浏览器并不支持直接在页面上浏览,因此才会提示下载。
JAVA代码
JavaEE中只需要书写Servlet程序,在Servlet程序中,通过IO流把需要用户下载的文件以流的方式放给客户端,并且通过Response告诉客户端这些数据不能直接打开,需要下载。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>通过java代码对外提供下载</h1>
<a href="/servlet/testStream?filename=1.jpg">1.jpg</a>
<a href="/servlet/testStream?filename=2.rar">2.rar</a>
<a href="/servlet/testStream?filename=3.txt">3.txt</a>
<a href="/servlet/testStream?filename=4.ppt">4.ppt</a>
<br/>
<h1>通过超链接对外提供下载</h1>
<a href="/servlet/resource/1.jpg">1.jpg</a>
<a href="/servlet/resource/2.rar">2.rar</a>
<a href="/servlet/resource/3.txt">3.txt</a>
<a href="/servlet/resource/4.ppt">4.ppt</a>
</body>
</html>
public class TestStream extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件名
String filename = request.getParameter("filename");
//两头 告诉浏览器文件的类型
response.setContentType(this.getServletContext().getMimeType(filename));
//告诉浏览器文件名 获取浏览器类型
String agent = request.getHeader("User-Agent");
String encodeFilename="";
if(agent.contains("MSIE")){
//IE
encodeFilename= URLEncoder.encode(filename,"utf-8");
encodeFilename=filename.replace("+"," ");
}else if(agent.contains("Firefox")){
//火狐
BASE64Encoder base64Encoder=new BASE64Encoder();
encodeFilename="=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
}else{
//其他
encodeFilename= URLEncoder.encode(filename,"utf-8");
}
response.setHeader("content-disposition","attachment;filename="+encodeFilename);
//两流
FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("/resource/" + filename));
OutputStream os = response.getOutputStream();
int b;
while((b=in.read())!=-1){
os.write(b);
}
in.close();
}
}