1. Web应用中实现文件下载的两种方式
超链接直接指向下载资源,程序实现下载需设置两个响应头:
设置Content-Type 的值为:application/x-msdownload。Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件。
Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type.
因为要下载的文件可以是各种类型的文件,所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用 方法返回 ServeltOutputStream 对象来向客户端写入文件内容。
2. 下载案例
遍历上传目录下的所有文件显示给用户,并允许用户完成下载。
(读取某一个文件夹下的所有的文件,存到集合里面List,再存到request作用域范围中)ListFileServelt—(将所有的文件列表显示)Listfiles.jsp-----DownloaServlet.java
3. 说了一点理论是不是感到有点晕,那么来点实际案例分析吧:
下载跳转的页面 listFile.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'download.jsp' starting page</title>
</head>
<body>
<c:forEach var="me" items="${map}">
<c:url var="url" value="/Download">
<c:param name="fileName" value="${me.key}"/>
</c:url>
文件名:${ me.value }
<a href="${ url }">下载</a><br><br>
</c:forEach>
</body>
</html>
下载直接进去的页面 ListFile.java
package com.csdn.servlet;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListFile extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = this.getServletContext().getRealPath("WEB-INF/upload");
Map map = new HashMap();
this.getListFile(new File(filePath), map);
request.setAttribute("map",map);
request.getRequestDispatcher("/listFile.jsp").forward(request, response);
}
private void getListFile(File file,Map map){
//这里的判读是判断upload文件下的是文件还是文件夹
if(file.isFile()){
String uuidName = file.getName();
String realName = uuidName.substring(uuidName.indexOf("_")+1);
map.put(uuidName,realName);
}else{
File[] files = file.listFiles();
for(File f : files){
getListFile(f,map);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
主要操控下载的类 Download.java
package com.csdn.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Download extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取文件名和文件路径
String fileName = request.getParameter("fileName");
fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
String savePath = this.getPath(this.getRealName(fileName));
//把获取到的文件名和路径放到一个file文件中
File file = new File(savePath+"\\"+fileName);
//判断文件file是否存在,存在了开始获取数据流并下载
if(!file.exists()){
request.setAttribute("message2","您下载的资源不存在");
request.getRequestDispatcher("./message").forward(request, response);
}
//设置响应头,包括设置头的文件名和编码,设置头后下载会自动弹出下载保存框提示,这里的设置头一定要写对,严格的格式,否则下载的时候文件名不对
response.setHeader("content-disposition","attachment;fileName="+URLEncoder.encode(this.getRealName(fileName),"UTF-8"));
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
in.close();
}
public String getPath(String fileName){
int dir1 = fileName.hashCode()&0xf;
int dir2 = (fileName.hashCode()>>4)&0xf;
String savePath = this.getServletContext().getRealPath("WEB-INF/upload")+"\\"+dir1+"\\"+dir2;
return savePath;
}
public String getRealName(String fileName){
String realName = fileName.substring(fileName.indexOf("_")+1);
return realName;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}