关键字:
浏览器禁止访问本地文件,浏览器安全,同源策略,跨域访问
用路径上传文件到服务器,不用手动浏览选择上传
activex,activexobject
问题缘起一个需求:
用户有文件a,a中记录了一些路径,用户要求在上传a的同时,解析a,并将a中所有路径指向的其本地文件全部上传到远程服务器
平时传文件时不知大家有没有注意,只要是传本地文件到服务器,必须要让用户手动浏览再选择,如果只有个文件路径,是不能上传的,这涉及到浏览器安全策略
浏览器在一般情况下严禁访问本地文件,如果能随便访问的话,那上个网分分钟自己电脑东西就被人偷走了
因此这个需求在刚接到时感觉是不可能的,最近似的方法是用一个批量上传文件插件,但是还是要手动选择
在网上搜前端解决方法,不管是js还是flash,都需要用户的手选那么一下
在网上学习了一下,很多人都发帖问解决方法,发现了有解决这个问题的方法,但是应用不多,资料比较少,在这里整理为以下,这是我能在网上找到的所有解决方法
解决思路
1、利用ie的activex控件,读取本地文件,将文件内容上传到服务器,服务器新建文件
2、还是利用activex控件,运行本地程序,本地程序直接将文件上传
3、利用自定义协议Asynchronous Pluggable Protocols,运行本地程序
activex:只能ie
是ie的插件,只支持ie,且在运行前先调低浏览器安全等级,允许activex运行,在运行时还要手动确认
在网上搜索,ActiveXObject 对象 (JavaScript),有windows官方文档https://msdn.microsoft.com/library/7sw4ddf8(v=vs.94).aspx
里面简介了这个控件的用法,主要是创建activexobject对象,可以操作本地文件、文件夹、磁盘等,可以读写移动删除。
但是从他给出的类型来看,只有txt、word、excel、shell四种类型可以操作,没有图片
因此如果是自带类型,可以读内容,然后再远程创建文件写入
如果不是自带类型,如图片,我想直接以txt类型读,传输字节流,在远程收到后再转换成图片
在网上搜了一下,还没有用这个方法做成功的,唯一一个尝试的:http://www.iteye.com/problems/83344
关于shell调用本地程序:
activexobject创建的WScript.Shell对象,这个对象的run和exec函数,相当于cmd命令行,可以执行一些命令,我自己尝试了执行exe程序和java -jar命令都成功,
可以用这个调用本地程序,然后在本地文件中写一些操作。
在网上看,似乎这个对象是vbscript的,不是很懂
具体调用方法,网上查WScript.Shell关键字即可
另外,activex对象在操作excel等类型似乎还有一些实用的函数,类似第几个单元格,第几行数据,但是我在网上查不到一个完整的文档
在http://www.netpc.com.cn/doc/jscript/html/jsfctgetobject.htm
还有个函数GetObject,,这个得到对象后甚至能查看图层?
参考:
http://www.jsann.com/post/activexobject_in_javascript.html
http://blog.csdn.net/chen_zw/article/details/9336375
http://blog.csdn.net/superbirds/article/details/6762748
http://www.jb51.net/article/25233.htm
自定义协议Asynchronous Pluggable Protocols
有一个windows官方文档是https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx,标题Registering an Application to a URI Scheme
这个自定义协议即是自定义一个url头,在注册表中注册后,点击这个连接会自动运行绑定的程序,网页上开启qq、迅雷就是这个原理
具体的操作方法,以及如何编写reg注册表文件,
参考:
http://blog.csdn.net/chen_zw/article/details/38458855
http://www.cnblogs.com/phinecos/archive/2009/03/06/1404951.html
http://www.cnblogs.com/liushaofeng89/p/5432770.html
http://blog.csdn.net/tbj621/article/details/38928775
一些其他:
听说有个东西ADODB.Stream,在网上查了半天没看懂,好像也有类似功能
浏览器不仅打开客户端本地程序,还控制程序,参考:http://blog.csdn.net/pony12/article/details/16883293
后记:
本来已经开始着手实现了,后来又沟通了一下,发现是理解错了,对方说文件和文件里面路径指向的文件是都放在一个压缩包里的,没有我想的这么复杂
但是也不白浪费这时间,毕竟看到了这些技能。