文件下载
1.使用超链接下载
缺点:当下载浏览器能够识别的格式就会直接打开,比如图片,txt等文件。
2.使用程序下载(设置两个头Content-Type 和Content-Disposition )
下载时要设置的头:
(1)设置 Content-Type 有两种方法,分别是下面
response.addHeader("Content-Type","image/jpeg"); //用于已经知道文件MIME情况下
response.setContentType(this.getServletContext().getMimeType("文件名")); //这种清开灵是在未知文件类型的情况下 比如动态获取某文件夹下的所有文件的时候
1.使用超链接下载
缺点:当下载浏览器能够识别的格式就会直接打开,比如图片,txt等文件。
2.使用程序下载(设置两个头Content-Type 和Content-Disposition )
下载时要设置的头:
(1)设置 Content-Type 有两种方法,分别是下面
response.addHeader("Content-Type","image/jpeg"); //用于已经知道文件MIME情况下
response.setContentType(this.getServletContext().getMimeType("文件名")); //这种清开灵是在未知文件类型的情况下 比如动态获取某文件夹下的所有文件的时候
(2) 设置 Content-Disposition,并且将中文文件名要进行URL编码
response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"utf-8"));(3) ie6浏览器在URL编码时特殊字符转换有问题,推荐不要在超链接中将中文直接发给浏览器,而是先进行URL编码,将编码好的内容发给浏览器,从而能防止ie6自己 进行URL编码时的错漏,这种情况多出现在将文件路径作为参数传递。
单个下载例子,直接访问sevlet
import java.io.FileInputStream;
import java.io.IOException;
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 {
response.setContentType(this.getServletContext().getMimeType("美人.jpg"));//设置mime
response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode("美人.jpg","utf-8"));//中文加编码
FileInputStream fin = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
int i = 0;
while((i = fin.read())!=-1){
response.getOutputStream().write(i);
}
fin.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
例子二 下载某个目录下的所有文件
jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="java.io.File"%>
<%@page import="java.net.URLEncoder"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Queue<File> queue = new LinkedList();
String path = "c://music";
File rootFile = new File(path);
queue.offer(rootFile);
while(queue.size()>0){
File file = queue.poll();
//如果是一个文件夹,遍历这个文件夹,将子目录加入到队列中
File [] fs = file.listFiles();
for(File f : fs){
if(f.isDirectory())queue.offer(f);
else{
%>
<a href="${pageContext.request.contextPath }/servlet/DownLoadList?path=<%=URLEncoder.encode(f.getAbsolutePath(),"utf-8") %>"><%=f.getName() %></a><br>
<%
}
}
}
%>
</body>
</html>
服务端控制下载:
import java.io.FileInputStream;
import java.io.IOException;
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 DownLoadList extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getParameter("path");
path = new String(path.getBytes("iso8859-1"),"utf-8");
String fileName = path.substring(path.lastIndexOf("\\")+1);
response.setContentType(this.getServletContext().getMimeType(fileName));
response.addHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"utf-8"));
FileInputStream fin = new FileInputStream(path);
int i = 0;
while((i = fin.read())!=-1){
response.getOutputStream().write(i);
}
fin.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}