看了很多左键点ie链接可以下载文件而不是直接打开的例子,但大多都是用了stream类似的方法。即由url得到下载文件的全路经,直接使用输入/输出流,把这个文件传给客户端。但我现在做的一个项目中,出于安全的要求,不能让用户由数据流获得文件,(所有访问权限都由url判定),所以下载文件必须用url重定向的方法。即<a href="下载文件的url"> 或者在servlet里 response.sendRedirect("url");
可是这样鼠标左键点击就会使ie直接打开文件(有时候不能识别的字符码文件也会强行打开)请问有没有啥方法能在服务器端控制该文件的下载方式,(不能用stream的方法)。
可是这样鼠标左键点击就会使ie直接打开文件(有时候不能识别的字符码文件也会强行打开)请问有没有啥方法能在服务器端控制该文件的下载方式,(不能用stream的方法)。
以tomcat为例
在web.xml里添加mime映射
比如加入RAR类型的映射
<mime-mapping>
<extension>rar</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
具体哪种文件用什么mime映射 去网上搜一下就有了
如果用数据流的话,能访问 "下载功能的那个servlet" 的用户随便加个参数就能下载他想要的东西了。
并把他设置为隐藏的,
并让你a标签的target属性指向该标签iframe就行了
<a href="下载文件的url" target="aa">
可是你用这种“URL 直接访问物理文件”的方式,连“随便加个参数”都不需要,直接敲那个 URL 就能下载他想要的东西了。不能总是“领导让干啥就傻干”,至少要弄清楚领导为啥让这么干,这样才有可能终有一天当上领导,haha :D其实“安全问题”应该不是这两种方式的主要差异。“用专门的 servlet 负责下载”的方法可以在那个 servlet 里直接处理授权问题;“用 URL 直接访问物理文件”的方式可以通过设置拦截器等方式处理授权问题。真正的区别在于,前者适合于提供动态生成的文件内容,后者适合提供静态内容。如果用于提供下载的内容是静态内容(也就是事先已经固化成为一个文件的形式),那就可以用这种方法直接由 Web 服务器负责把文件回传给客户端。那么回到楼主的问题,如何控制客户端的下载方式也就成了 Web 服务器的责任。那就用 5 楼的正宗解法吧 :)
1 依然会发送一个完整的链接给用户,你用flashget 下载看看就看到了,所以不安全的。2 直接下载,需要修改你的 应用服务器里面的 <mime-mapping>
这个根据服务器不同,做法也不一样。
tomcat 里面就是 tomcat/conf/web.xml
这样做安全很多啊,通过inputstream来获取硬盘上的路径,可以起到隐藏服务器文件路径的作用,至于你说的
不能让用户由数据流获得文件,只要在形成outputstream之前判断一下用户名或权限之类的就行了啊,
<iframe name="aa" style="display: none;"> </iframe>标签只是防止左键点击下载的时候会打开一个空白的IE页面
你可以简单的理解为一张表
对应关系就是 .文件名 -> 处理方式
所以,修改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里