一個使用Servlet文件實現文件下載的實例


一個使用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);

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM