一個使用Servlet文件實現文件下載的實例
(可以擴充本實例實現:對用戶隱藏他要下載文件的路徑,或者在下載文件時要做一些其他的工作,如檢查用戶有沒有下載此文件的權限等)
了解在Servlet中如何控制輸出流以及response對象的contentType相關知識
一個Servlet文件DownloadFile,在此Servlet中讀取要下載的文件,然后寫到響應流中以達到用戶下載文件的目的。要下載的文件可以放在任何地方,並且是對用戶隱藏的。
在DownloadFile Servlet中,首先要得到要下載文件的文件名filename,同時要預先定義好文件保存的路徑,然后設置response對象的內容類型和頭信息,最后讀取要下載文件的字節流並寫到response的輸出流中。
DownloadFile.java源文件
package myservlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadFile extends HttpServlet {
//字符編碼
private final String ENCODING="GB2312";
//內容類型
private final String CONTENT_TYPE="text/html;charset=gb2312";
//要下載的文件存放的路徑
private String downloadfiledir="d:\\temp\\";
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//設置request對象的字符編碼
request.setCharacterEncoding(ENCODING);
//從request中取出要下載文件的名字
String filename=request.getParameter("filename");
if(filename==null||filename.trim().equals("")){
//設置response對象的ContentType
response.setContentType(CONTENT_TYPE);
//輸出錯誤信息
PrintWriter out=response.getWriter();
out.println("<font color=red>輸入的文件名無效!</font>");
out.close();
}else{
//下載文件的完整路徑名
String fullfilename=downloadfiledir+filename;
System.out.println("下載文件:"+fullfilename);
//根據文件的類型設置response對象的ContentType
String contentType=getServletContext().getMimeType(fullfilename);
if(contentType==null)
contentType="application/octet-stream";
response.setContentType(contentType);
//設置response的頭信息
response.setHeader("Content-disposition","attachment;filename=\""+filename+"\"");
InputStream is=null;
OutputStream os=null;
try{
is=new BufferedInputStream(new FileInputStream(fullfilename));
//定義輸出字節流
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//定義response的輸出流
os=new BufferedOutputStream(response.getOutputStream());
//定義buffer
byte[] buffer=new byte[4*1024]; //4k Buffer
int read=0;
//從文件中讀入數據並寫到輸出字節流中
while((read=is.read(buffer))!=-1){
baos.write(buffer,0,read);
}
//將輸出字節流寫到response的輸出流中
os.write(baos.toByteArray());
}catch(IOException e){
e.printStackTrace();
}finally{
//關閉輸出字節流和response輸出流
os.close();
is.close();
}
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//調用doGet()方法
doGet(request,response);
}
}