文件下载
一、下载的两种方式
a) 超链接直接指向下载资源
b) 设置实现下砸需要的两个相应头:
i. 设置Coutent-Type的值为application/x-msdownload.
response.setContentType("application/x-msdownload");
String str="attachment;filename="+java.net.URLEncoder.encode(realname,"UTF-8");
response.setHeader("Content-Disposition",str);
ii. 由于下载的文件可能是各种类型文件。所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用 方法返回 ServeltOutputStream 对象来向客户端写入文件内容。
ServletOutputStream sos=response.getOutputStream();
Byte[] data=new byte[2048];
Int len=0;
While((len-is.read(data))>0){
Sos.write(data,0,len);
}
二、实例代码:
a) Jsp代码
<body>
<h2>下载资源列表</h2>
<c:forEach items="${map}" var="me">
<!--(1)
文件名:${me.value} <a href="${pageContext.request.contextPath}/servlet/DownloadServlet?filename=${me.key}">下载</a> <br/>
-->
<!-- (2) -->
<c:url value="/servlet/DownloadServlet" var="fileAddr"><!-- 保存地址 -->
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
文件名:${me.value} <a href="${fileAddr}">下载</a> <br/>
</c:forEach>
i. </body>
b) listFileServlet.java 代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到保存上传文件的文件夹
String savePath=this.getServletContext().getRealPath("WEB-INF/upload");
Map map=new HashMap();
listFiles(new File(savePath),map);
request.setAttribute("map",map);
request.getRequestDispatcher("/listFiles.jsp").forward(request, response);
}
//递归方法遍历该文件夹下的子文件及子文件夹下的文件
private void listFiles(File file,Map map){
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){//遍历每一个文件夹
listFiles(f, map);
}
}
}
c) DownloadServlet.java代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//找到用户选定的文件--确定文件的保存位置
String uuidname=request.getParameter("filename");
uuidname=new String(uuidname.getBytes("ISO8859-1"),"utf-8");
String realname=uuidname.substring(uuidname.indexOf("_")+1);
String savePath=getFileAddr(realname);
File f=new File(savePath+"\\"+uuidname);
if(f.exists()){
System.out.println(savePath+"\\"+uuidname);
response.setContentType("application/x-msdownload");
String str="attachment;filename="+java.net.URLEncoder.encode(realname,"UTF-8");
response.setHeader("Content-Disposition",str);
//创建一个输入流对象和指定的文件相关联
FileInputStream in=new FileInputStream(f);
//respon对象获取输出流对象
OutputStream out=response.getOutputStream();
//将从输入流对象中度数据写入到输出流对象中
byte[] buff=new byte[1024];
int len=0;
while((len=in.read(buff))>0){
out.write(buff,0,len);
}
}else{
request.setAttribute("message","下载资源不存在");
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
}
private String getFileAddr(String filename){
int dir1=filename.hashCode() & 0x0f;
int dir2=filename.hashCode()>>4 & 0x0f;
String savePath=this.getServletContext().getRealPath("WEB-INF/upload")+"\\"+dir1+"\\"+dir2;
return savePath;
1. }