我要啦免费统计

微蓝领域

我的学习档案馆
posts - 19, comments - 57, trackbacks - 0, articles - 57
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JSP实现文件下载

Posted on 2007-08-07 15:42 hilor 阅读(599) 评论(0)  编辑  收藏 所属分类: J2EE
jsp中实现文件下载的最简单的方式是在网页上做超级链接,如:<a href="music/abc.mp3">点击下载</a>。但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不安全的因素。因此可以采用其它方式实现下载,可以采用:1、RequestDispatcher的方式进行;2、采用文件流输出的方式下载。

1、采用RequestDispatcher的方式进行

           jsp页面中添加如下代码:
          <%
     response.setContentType("application/x-download");//设置为下载application/x-download
     String filedownload = "/要下载的文件名";//即将下载的文件的相对路径
     String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称
     filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");
     response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
    
     try
     {
         RequestDispatcher dis = application.getRequestDispatcher(filedownload);
         if(dis!= null)
         {
             dis.forward(request,response);
         }
         response.flushBuffer();
     }
     catch(Exception e)
     {
         e.printStackTrace();
     }
     finally
     {
    
     }
%>

2、采用文件流输出的方式下载

        <%@page language="java" contentType="application/x-msdownload"   pageEncoding="gb2312"%><%
     //关于文件下载时采用文件流输出的方式处理:
     //加上response.reset(),并且所有的%>后面不要换行,包括最后一个

     response.reset();//可以加也可以不加
     response.setContentType("application/x-download");
     String filedownload = "想办法找到要提供下载的文件的物理路径+文件名";
     String filedisplay = "给用户提供的下载文件名";
     filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
     response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);

     OutputStream outp = null;
     FileInputStream in = null;
     try
     {
         outp = response.getOutputStream();
         in = new FileInputStream(filenamedownload);

         byte[] b = new byte[1024];
         int i = 0;

         while((i = in.read(b)) > 0)
         {
             outp.write(b, 0, i);
         }
         outp.flush();
     }
     catch(Exception e)
     {
         System.out.println("Error!");
         e.printStackTrace();
     }
     finally
     {
         if(in != null)
         {
             in.close();
             in = null;
         }
         if(outp != null)
         {
             outp.close();
             outp = null;
         }
     }
%>

 
另外
 

要作一个jsp文件上传和下载的东东,上传使用的是jspsmartupload,采用的方法是将文件上传至一个目录下(c:\tomcat\webapps\root\upload),然后将文件名存入到数据库中,页面显示时从数据库中读出文件名,其下载链接直接指向upload目录,但是如果文件名是中文时,下载会出现乱码,在网上找了好多资料,终于找到了解决的办法

下载页面 test.jsp

 

下载

操作页面testdown.jsp

<%
  java.io.BufferedInputStream bis=null;
  java.io.BufferedOutputStream  bos=null;
 try
 {
   String filename=request.getParameter("filename");
    filename=new String(filename.getBytes("iso8859-1"),"gb2312");
   response.setContentType("application/x-msdownload");
   response.setHeader("Content-disposition","attachment; "+
    "filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
  String filepath = "C:\\Tomcat\\webapps\\lynews\\upload\\";
   bis =new java.io.BufferedInputStream(new java.io.FileInputStream("+
    "config.getServletContext().getRealPath("files/" +filepath+ filename)));
   bos=new java.io.BufferedOutputStream(response.getOutputStream());
   byte[] buff = new byte[2048];
   int bytesRead;
   while(-1 != (bytesRead = bis.read(buff, 0, buff.length)))
   {
    bos.write(buff,0,bytesRead);
   }
 }
 catch(Exception e)
 {
    e.printStackTrace();
 }
 finally
 {
    if(bis != null)bis.close();
    if(bos != null)bos.close();
 }
%>


只有注册用户登录后才能发表评论。


网站导航: