日期:2014-05-17  浏览次数:20792 次

JS实现Html File控件赋值

网上搜索了半天也没有完整的解决方案。
用以下方法需要添加到信任站点或解除未签名的ActiveX控件的禁用

?

1. 模拟键盘输入法: 不足的地方是不支持中文

把<input type="file" />设计只读且不允许自动赋值的目的是出于安全性考虑,试想一下,如果允许程序自动赋值,那么也可以在服务器生成页面时放置一段脚本,在浏览器访问该页面后,自动把本地的某一个重要文件路径赋值到一个文件上传控件,然后自动上传到服务器,那会是多可怕的事情!! 一个恶意网站就可以把我们机器上的一些机密文件神不知鬼不觉地盗走了.
既然不允许赋值,在有些情况下又要求实现文件自动上传,到底能不能实现呢? 有一种办法,就是模拟键盘输入来达到赋值的目的,先贴代码:

?

Html代码 收藏代码
  1. <inputname="myfile"type="file"/>
  2. <scriptlanguage="JavaScript">
  3. window.attachEvent("onload",setfile);
  4. varWshShell=newActiveXObject("WScript.Shell");
  5. functionsetfile(){
  6. setTimeout('document.all.myfile.focus();WshShell.sendKeys("C:/java/sdfs/11/11.jpg");',20);
  7. }
  8. </script>

?

这段代码是通过WScript.Shell控件来实现模拟键盘输入的效果:
WshShell.sendKeys("C:/java/sdfs/11/11.jpg");
在模拟键盘输入之前,先把光标定位在要操作控件上:
document.all.myfile.focus();
在给下一控件赋值之前,先停一段时间:
setTimeout('document.all.myfile.focus();WshShell.sendKeys("C:/java/sdfs/11/11.jpg");',20);
这样做的目的是因为focus操作花费的时间比较长,而sendKeys操作又很快,如果不加上延时,sendKeys操作一般都在focus之前就执行完了,导致输入框接收不到输入值。

?

2. 把文件先复制到剪切再粘贴到Input File 控件中,可以解决中文问题


项目需求是自动搜索客户端的图片,找到合适的自动上传(理论上能上传任何东西)前提就是上面提到的.
用这个方法经测试成功.上传OK!(注意不安全哟,不要用此做坏事哟,此源码只做交流,请不要用于非法用途)

大概写一下流程:

Html代码 收藏代码
  1. <HTML>
  2. <HEAD>
  3. <TITLE>冲击多个InputFile赋值兼解决中文赋值问题</TITLE>
  4. <SCRIPTLANGUAGE="JavaScript">
  5. //简化写法
  6. function$(id)
  7. {
  8. returndocument.getElementById(id);
  9. }
  10. //崋值方法(就是将文本框的值赋值file对象)
  11. functionset1()
  12. {
  13. //将text1中的值复制到剪贴板中
  14. window.clipboardData.setData('text',$('t1').value);
  15. //创建Shell(需要添加到信任站点或解除未签名的ActiveX控件的禁用
  16. varWshShell=newActiveXObject("WScript.Shell");
  17. //拿到焦点<