直接让客户端浏览器下载已知类型的文件

Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前 我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方:  
    一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程序来打开所下载的文件。比如:在Windows平台上,如果用户点击的 链接链接的是一个“.doc”文件的话,那么,浏览器就会启动Microsoft   Word应用程序来打开它。  
    二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。  
    这种办法是可靠的,但你必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录 之外的一个目录里,比如:如果你的虚拟目录是C:/Mengxianhui/Tomcat4/Website/MyApp的话,那么,存放在该目录和该目 录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为 “application/octet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content- Disposition,设定值为:attachment;   filename   =   theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。下面,我们 就平常最常用的JSP和ASP页面来举一个实际应用的例子。  
     
      TestFileDownload.JSP页面的例子:  
       
      <%  
      //   得到文件名字和路径  
      String   filename   =   "MengxianhuiDocTest.doc";  
      String   filepath   =   "D://";  
       
      //   设置响应头和下载保存的文件名  
      response.setContentType("APPLICATION/OCTET-STREAM");  
      response.setHeader("Content-Disposition",  
      "attachment;   filename=/""   +   filename   +   "/"");  
     
      //   打开指定文件的流信息  
      java.io.FileInputStream   fileInputStream   =  
        new   java.io.FileInputStream(filepath   +   filename);  
         
      //   写出流信息  
      int   i;  
      while   ((i=fileInputStream.read())   !=   -1)   {  
        out.write(i);  
      }  
      fileInputStream.close();  
      out.close();  
    %>  
     
    值得注意的是:在你要下载的文件内容里,除了文件的内容之外,不应该再附加有其它任何的字符,包括空格和回车换行符。我们有时在编写代码的时候,为了使代 码清晰可读,往往会添加一些空格、制表符或者回车换行符,这样虽然看起来比较清晰,但有时可能会得不到正确的结果。比如:  
    <%@   page   import="java.io.*"  
    %>     <jsp:useBean   id="MyBeanFromMengxianhui"   scope="page"  
    class="com.Mengxianhui.DownloadBean"   />  
    应该写成这样:  
    <%@   page   import="java.io.*"  
    %><jsp:useBean   id="MyBeanFromMengxianhui"   scope="page"  
    class="com.Mengxianhui.DownloadBean"   />  
     
    TestFileDownload.ASP页面的例子:  
     
    在ASP里,没有提供从文件读取文件流信息的方法,因此,为了得到文件的流信息,我们必须借助其他的工具,最简单的就是编写一个VB或C的DLL组件,让 组件返回文件的流信息。下面是一个用VB编写的DLL的例子,工程名字为MengXHFileDownLoad,类模块的名字为 BinReadFromFile,类方法readBinFromFile如下:  
       
    Function   readBinFromFile(ByVal   bfilename   As   String)   As   Variant  
            Dim   fl   As   Long  
            Dim   FileNum   As   Long  
            Dim   binbyte()   As   Byte  
            Dim   binfilestr   As   String  
             
            On   Error   GoTo   errHandler            
            FileNum   =   FreeFile            
            Open   bfilename   For   Binary   As   #FileNum            
            fl   =   FileLen(bfilename)  
            ReDim   binbyte(fl)            
            Get   #FileNum,   ,   binbyte            
            Close   #FileNum            
            readBinFromFile   =   binbyte  
            Exit   Function  
                       
    errHandler:  
            Exit   Function  
    End   Function  
     
    把上面的代码编译成MengXHFileDownLoad.DLL,然后注册即可使用。下面以直接下载一个When   A   Man   Loves   A   Woman.mp3的MP3文件为例子,我们要编写的ASP脚本代码如下:  
     
      <%@   Language=VBScript   %>  
      <%  
        Response.buffer   =   TRUE  
        Response.ContentType   =   "APPLICATION/OCTET-STREAM"  
        Response.AddHeader   "Content-Disposition","attachment;filename=When   A   Man   Loves   A   Woman.mp3"  
         
        Dim   varStream,   oMyObject  
           
        Set   oMyObject   =   Server.CreateObject("MengXHFileDownLoad.BinReadFromFile")  
        varStream   =   oMyObject.readBinFromFile("E:/MengXianhui/Mp3/When   A   Man   Loves   A   Woman.mp3")  
        Response.BinaryWrite(varStream)    
        Set   oMyObject   =   Nothing    
         
        Response.End  
      %>  
     
    当我们运行上面的TestFileDownload.ASP文件时,浏览器会弹出一个文件下载的对话框,提示我们下载,而不是用默认的MP3播放器打开。  
    这种方法也可以把我们的ASP页面生成的HTML源代码保存成一个文件,下面的代码会提示你把ASP执行的结果保存成Test.htm文件。具体的方法是:  
      <%  
        Response.ContentType   =   "APPLICATION/OCTET-STREAM"  
        Response.AddHeader   "Content-Disposition","attachment;filename=Test.htm"  
        Response.write   "<div   style='background-color:navy;color:#FFFFFF'>测试</div>"  
        Response.write   "<a   href='http://lucky.myrice.com'>"  
        Response.write   "<img   src='http://lucky.myrice.com/back.jpg'>【孟宪会之精彩世界】</a>"  
        Response.End  
      %>  
     
    当我们的文件数目很少时,也可以直接在服务器端进行设置,让这些文件直接下载。具体做法是:在Internet服务管理器里,选“属性”项,然后选“HTTP   Headers”标签页进行设置即可!!  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值