自动图象客户端存储程序的JavaScript实现
ccton 2003-02-20 02:08:27
自动图象客户端存储程序的JavaScript实现
BY: ccton
原理:
不使用execCommand(SaveAs)方法,不使用ContextMenus(右键菜单)控件;
使用ActiveXObject的FileSystemObject扫描IE客户端缓存,从中直接拷贝需要的图象。
原理要点:
用本地HTA程序创建客户区访问网页,可以越过“同一域名”的限制,完全获得对网页的页面内部元素的访问能力。
对该页面images数组分析,获得所有img元素的个数,通过每个img的SRC获得文件名。
通过每个img元素的complete属性(oImage.complete)获知每张图片的下载状态。
*****技巧:设定最大尝试次数,在这个次数之内:
如果在该页面的body.onload事件之后,仍有某张图片未能正确下载,提取其outerHTML(或者整个body.innerHTML)重新写入,重新下载它。
(如果重写body.innerHTML,该页面其他部分会从缓存提取,不用担心已完成的部分会从服务器下载。这里,不建议使用reload方法,因为
你不知道究竟缓存里有没有该张图片,所以无法对整个document的reload方法给出正确参数)
可以通过setTimeout定时检查页面的各种onload事件/readyState属性来确定该页面各元素的加载状态,也可以人工监视页面加载状态。
因为往往存在img文件重名的情况,例如01.jpg,这个重名的机会就太大了。至少目前,偶还没有找出如何访问缓存文件的“Internet地址属性”的方法。
暂时的解决方法是在导航开始时记录时间,然后如果发生重名,就对找到的文件比较“最后访问时间”。
**(注:1.应用“最后访问时间”比较,甚至不需要访问页面元素获得文件名,只需要到缓存里去搜索那些在导航时间以后建立的jpg,gif...图象类型文件就OK了。2.必须考虑到IE的缓存设置,默认的是每次会话期间使用缓存文件,如果要确保按时间的搜索正确进行,开干前关闭IE,等上几秒钟再重新打开)
注意IE缓存里的文件名带有“[1]”之类的后缀,搜索时必须考虑到。
原因:
IE5(含IE5)以下不支持execCommand()方法对oIframe.document对象的SaveAs操作,如果对oIframe.document对象运用该方法,实际被SaveAs的是顶层父窗口document对象。这样采用execCommand()方法必须打开新窗口,对要提取的图象重新下载,这显然是不明智的。
不鼓励开发人员仅仅安装IE5.5+,特别是在你只有一台机器的时候。很显然你的程序必须至少支持IE5。
Contextmenus菜单控件没有找到相应的接口参考资料,暂时没法做。
程序能力:
自动将网页内所含的所有图片文件保存到指定主目录中、按给出的前缀新建子目录下。
例:
主目录为“C:\”,前缀“imgs”
则该网页的图象文件保存于 “C:\imgs-001\”下。其中,序号为自动增加。每次点击“保存”都会建立一个新的子目录。
程序限制:
未考虑网页包含框架的情形
默认查找win98的IE缓存目录。如果你用的是XP/ME/2000/NT,需要选择当前缓存目录。
给出的主目录必须是已经存在的。
限制多多的原因:
我懒!咋的了?
程序使用:
将ImgSaver.hta和Controler.htm保存到同一目录下
双击运行ImgSaver.hta
输入网页地址,按“GO”将主窗口导航到该网页
选择图象存储主目录 (默认C:\)
选择当前缓存目录(非WIN98时)
点击“保存图象”开始保存
保存结束后,会弹出“图象保存完毕”提示。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本来想把源代码贴上来,可是源代码要修改修改才能贴出来,(原来的目的比较不可告人:-))))))
太麻烦了,算了。
思路有了,而且偶已经做成功的了,各位放心照这办法自己写吧。