Servlet 实现下载功能

一个使用Servlet文件实现文件下载的实例(可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等)了解在Servlet中如何控制输出流以及response对象的contentType相关知识一个Servlet文件DownloadFile,在此Servlet中读取要下载的文件,然后写到响应流中以达到用户下载文件的目的。要下载的文件可以放在任何地方,并且是对用户隐藏的。在DownloadFile Servlet中,首先要得到要下载文件的文件名filename,同时要预先定义好文件保存的路径,然后设置response对象的内容类型和头信息,最后读取要下载文件的字节流并写到response的输出流中。
 
 
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);

 }

}
别处Copy的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值