2--Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程
序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务
器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type
response.setContentType("application/x-msdownload");
String st="attachment;filename="+java.net.URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-Disposition",st);
将下载的文件传递给客户端,相应的内容应该当做二进制来处理。应该用方法调用返回ServletOutputStream对象想客户端写入文件。、
ServletOutputStream os=reponse.getOutputStream();
byte[ ] data=new byte[1024];
int len=0;
while((len=is.read(data))>0){
os.write(data,0,len);
}
要实现文件下载需要:ListFileServlet.java DownloadServlet.java listfile.jsp
ListFileServlet.java
1.得到保存上传文件的文件夹
String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
2. 创建方法,迭归文件夹下面的所有文件
listFiles(new File(savepath),map);
3. 将Map对象写入request,传至listfiles.jsp
listfile.jsp
取出map中的数据,构建URL作为下载链接的href的属性值
<c:forEach var="current" items="${fileMap }">
<c:url var="fileAddr" value="/servlet/DownloadServlet">
<c:param name="uuidName">${current.key }</c:param>
<c:param name="realName">${current.value}</c:param>
</c:url>
文件名:${current.value }
<a href="${fileAddr }" >下载</a><br/><br/>
</c:forEach>
DownloadServlet.java
1. 从request中读取文件名等信息。中文字符使用的URLEncoding,需要进行手动编码转换。
String uuidName=request.getParameter("uuidName");
String realName=request.getParameter("realName");
因为参数是通过url传过来的,所以需要手动进行编码转换
uuidName=new String(uuidName.getBytes("iso8859-1"),"utf-8");
realName=new String(realName.getBytes("iso8859-1"),"utf-8");
因为realName需要放到response的头contetn-dispposition中去,发送到客户的浏览器端,所以需要对它调用URLEncoder的encode方法进行url编码,才可以保证
客户取到正确的中文文件名。
realName=URLEncoder.encode(realName,"utf-8");
2. 判断文件是否存在
if(!file.exists()){
request.setAttribute("message", "您要下载的文件不存在!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}else{
response.setHeader("content-disposition", "attachment;filename="+realName);
3. 获取输入流,并写入输出流
FileInputStream fis = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte [ ] buffer = new byte[1024];
int len = 0;
while((len=fis.read(buffer))>0){
out.write(buffer, 0, len);
}
fis.close();
4.设置一二级目录,获取文件地址
int dir1 = uuidName.hashCode() & 0xf;
int dir2 =(uuidName.hashCode()>>4) & 0xf;
String fileAddr = this.getServletContext().getRealPath("/WEB-INF/upload") +"\\" + dir1 + "\\" + dir2 + "\\" + uuidName;