文件下载方法和细节

文件下载
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);
	}

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章