网上搜索了半天也没有完整的解决方案。
用如下方法须要添加到信任站点或解除未签名的ActiveX控件的禁用html
1. 模拟键盘输入法: 不足的地方是不支持中文java
把<input type="file" />设计只读且不容许自动赋值的目的是出于安全性考虑,试想一下,若是容许程序自动赋值,那么也能够在服务器生成页面时放置一段脚本,在浏览器访问该页面后,自动把本地的某一个重要文件路径赋值到一个文件上传控件,而后自动上传到服务器,那会是多可怕的事情!! 一个恶意网站就能够把咱们机器上的一些机密文件神不知鬼不觉地盗走了.
既然不容许赋值,在有些状况下又要求实现文件自动上传,到底能不能实现呢? 有一种办法,就是模拟键盘输入来达到赋值的目的,先贴代码:程序员
- <input name="myfile" type="file" />
-
- <script language="JavaScript">
- window.attachEvent("
- var WshShell=new ActiveXObject("WScript.Shell");
- function setfile(){
- setTimeout('document.all.myfile.focus();WshShell.sendKeys("C:/java/sdfs/11/11.jpg");',20);
- }
- </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>
- <HEAD>
- <TITLE> 冲击多个Input File赋值兼解决中文赋值问题 </TITLE>
- <SCRIPT LANGUAGE="JavaScript">
- //简化写法
- function $(id)
- {
- return document.getElementById(id);
- }
- //崋值方法(就是将文本框的值赋值file对象)
- function set1()
- {
- //将text1中的值复制到剪贴板中
- window.clipboardData.setData('text',$('t1').value);
- //建立Shell(须要添加到信任站点或解除未签名的ActiveX控件的禁用
- var WshShell=new ActiveXObject("WScript.Shell");
- //拿到焦点
- $('f1').focus();
- //Ctrl + A 操做
- WshShell.sendKeys("^a");
- //Ctrl + V 操做(sendKeys对于中文赋值操做显得无力,因此只能模拟键盘操做)
- WshShell.sendKeys("^v");
- }
-
- function set2()
- {
- window.clipboardData.setData('text',$('t2').value);
- var WshShell=new ActiveXObject("WScript.Shell");
- $('f2').focus();
- WshShell.sendKeys("^a");
- WshShell.sendKeys("^v");
- }
-
- function set3()
- {
- window.clipboardData.setData('text',$('t3').value);
- var WshShell=new ActiveXObject("WScript.Shell");
- $('f3').focus();
- WshShell.sendKeys("^a");
- WshShell.sendKeys("^v");
- }
-
- function set4()
- {
- window.clipboardData.setData('text',$('t4').value);
- var WshShell=new ActiveXObject("WScript.Shell");
- $('f4').focus();
- WshShell.sendKeys("^a");
- WshShell.sendKeys("^v");
- }
- //给当前网页中四个file对象赋值的方法
- function set()
- {
- //此处不要用循环,有几个就须要写几个setXX方法
- setTimeout("set1()",0);
- setTimeout("set2()",70);
- setTimeout("set3()",240);
- setTimeout("set4()",340);
- }
- //检查是否赋值成功
- function check()
- {
- //检查每一个file对象是否为空
- if($('f1').value.length > 0 && $('f2').value.length > 0 && $('f3').value.length > 0 && $('f4').value.length > 0 )
- {
- //检查原对象的值的赋值对象的值是否相同
- if($('f1').value == $('t1').value && $('f2').value == $('t2').value && $('f3').value == $('t3').value && $('f4').value == $('t4').value)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- //赋值和file对象的检查
- function setValues()
- {
- if(!check())
- {
- set();
- }
- }
- //直接调用的赋值方法
- function callSet()
- {
- //必定要用setInterval,而不能用循环(循环太快,会形成全部的值赋在一个file对象上)
- setInterval('setValues()',1000);
- }
-
- </SCRIPT>
- </HEAD>
-
- <BODY>
- <input type=text value='c:\a好.jpg' id='t1' /> <br />
- <input type=text value='b:\b很差.jpg' id='t2'/> <br />
- <input type=text value='c:\c好.jpg' id='t3'/> <br />
- <input type=text value='d:\c很好.jpg' id='t4'/> <br />
-
- <input type=file id='f1'/> <br />
- <input type=file id='f2'/> <br />
- <input type=file id='f3'/> <br />
- <input type=file id='f4'/> <br />
-
- <input type='button' id='btn1' onclick='callSet();' value='测试'>
- </BODY>
- </HTML>
3. 清空Input File 控件value属性值ide
在 HTML 文档中 ,<input type="file"> 标签是浏览器向服务器发送选中文件的。该元素有一个 value 属性,保存了用户指定的文件的名称,为安全起见,file-upload 元素的value 属性是只读的,不容许程序员修改它的值,而且HTML value 属性也会被忽略。不过有时候咱们须要将这个标签的value的值清空,这就须要咱们动动脑筋了。
假设咱们已经获得了该file input的对象,为file_input_obj,下面是两种修改该标签value属性的方法:
方法一:
file_input_obj.outerHTML=file_input_obj.outerHTML.replace(/(value=\").+\"/i,"$1\"");
咱们也能够根据这个思路,触类旁通,好比先对该标签进行克隆,而后再替换掉该节点,等等,随便你怎么发挥都行。
方法二:
var WshShell=new ActiveXObject("WScript.Shell");
file_input_obj.focus();
file_input_obj.createTextRange().select();
WshShell.SendKeys("{del}");
使用这中方式,须要容许ActiveX控件,因此推荐使用第一个方法
这既解决了咱们遇到的问题,同时也为咱们提供了一种解决问题方式,咱们能够用相似的方法去解决相似的问题。测试
本文转自:http://www.blogjava.net/supercrsky/archive/2008/09/05/227275.html网站
http://blog.csdn.net/lizhihai_99/archive/2010/04/27/5533915.aspxspa
http://hi.baidu.com/78347079/blog/item/5ef6457793c0fc13b151b933.html