看了很多左键点ie链接可以下载文件而不是直接打开的例子,但大多都是用了stream类似的方法。即由url得到下载文件的全路经,直接使用输入/输出流,把这个文件传给客户端。但我现在做的一个项目中,出于安全的要求,不能让用户由数据流获得文件,(所有访问权限都由url判定),所以下载文件必须用url重定向的方法。即<a href="下载文件的url"> 或者在servlet里 response.sendRedirect("url"); 
可是这样鼠标左键点击就会使ie直接打开文件(有时候不能识别的字符码文件也会强行打开)请问有没有啥方法能在服务器端控制该文件的下载方式,(不能用stream的方法)。

解决方案 »

  1.   

    我以前用一个word文档的地址做链接是可以直接下载的
      

  2.   

    我刚用word文件试验了一下,还是不行,直接打开,都是乱码
      

  3.   

    哦不好意思刚才把word扩展名打错了,正确的.doc文件是可以被直接下载的。楼上作废(自己帖子咋不让改捏)
      

  4.   

    看你是什么服务器了
    以tomcat为例
    在web.xml里添加mime映射
    比如加入RAR类型的映射
    <mime-mapping> 
        <extension>rar</extension> 
        <mime-type>application/octet-stream</mime-type> 
    </mime-mapping>
    具体哪种文件用什么mime映射 去网上搜一下就有了
     
      

  5.   

    我也只用过word直接打开的那种,听听5楼高手的意见吧
      

  6.   

    如果楼主将要下载的内容是以文件形式存在于服务器上,而且有适当的扩展名,那么用 5 楼的方法是最正宗的。不过我有个疑问,楼主说“出于安全的要求,不能让用户由数据流获得文件”,这是怎么说的呢?真要考虑安全问题(要经过授权才能访问特定的文件),那正应该用所谓的“stream 方法”呀。你这种用 URL 直接指向一个物理文件的方法,如果人家直接敲 URL 进去,就可以直接下载这个文件了,你的“安全的要求”怎么体现呢?
      

  7.   

    领导让我用重定向的我就用重定向的啦用户访问url的权限由别的程序控制。
    如果用数据流的话,能访问 "下载功能的那个servlet" 的用户随便加个参数就能下载他想要的东西了。
      

  8.   

    resin也是这么加么? 那岂不是要加很多种进去。。另外请问mime是什么意思啊。。老看到老没弄清楚。
      

  9.   

    在你的页面里放一个<iframe name="aa" style="display: none;"></iframe>标签
    并把他设置为隐藏的,
    并让你a标签的target属性指向该标签iframe就行了
    <a href="下载文件的url" target="aa"> 
      

  10.   


    可是你用这种“URL 直接访问物理文件”的方式,连“随便加个参数”都不需要,直接敲那个 URL 就能下载他想要的东西了。不能总是“领导让干啥就傻干”,至少要弄清楚领导为啥让这么干,这样才有可能终有一天当上领导,haha  :D其实“安全问题”应该不是这两种方式的主要差异。“用专门的 servlet 负责下载”的方法可以在那个 servlet 里直接处理授权问题;“用 URL 直接访问物理文件”的方式可以通过设置拦截器等方式处理授权问题。真正的区别在于,前者适合于提供动态生成的文件内容,后者适合提供静态内容。如果用于提供下载的内容是静态内容(也就是事先已经固化成为一个文件的形式),那就可以用这种方法直接由 Web 服务器负责把文件回传给客户端。那么回到楼主的问题,如何控制客户端的下载方式也就成了 Web 服务器的责任。那就用 5 楼的正宗解法吧  :)
      

  11.   

    如果用JSPSMARTUPLOAD组件的话,解决这个问题很轻松,只需要一个方法即可
      

  12.   

    response.sendRedirect("url"); 
    1 依然会发送一个完整的链接给用户,你用flashget 下载看看就看到了,所以不安全的。2 直接下载,需要修改你的 应用服务器里面的 <mime-mapping> 
    这个根据服务器不同,做法也不一样。
    tomcat 里面就是 tomcat/conf/web.xml
      

  13.   

    刚找了一下,我也是在servlet里用outputstream出输出的,
    这样做安全很多啊,通过inputstream来获取硬盘上的路径,可以起到隐藏服务器文件路径的作用,至于你说的
    不能让用户由数据流获得文件,只要在形成outputstream之前判断一下用户名或权限之类的就行了啊,
     <iframe name="aa" style="display: none;"> </iframe>标签只是防止左键点击下载的时候会打开一个空白的IE页面
      

  14.   

    MIME是用来描述数据类型的
    你可以简单的理解为一张表
    对应关系就是 .文件名 -> 处理方式
    所以,修改MIME你就能让WORD去打开RAR文件,用EXCEL去打开HTML等等等等。。如果简单的需要让这一类型文件被下载
    就设成application/octet-stream<mime-mapping> 
        <extension>rar</extension> 
        <mime-type>application/octet-stream</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
        <extension>doc</extension> 
        <mime-type>application/octet-stream</mime-type> 
    </mime-mapping>
    .................一般默认的MIME映射本来就有很多了,不同的服务器配置文件位置不用,实在找不到用搜索文件-包含文字MIME
    来找,一般来说大多JSP容器都是在一个XML里