`
pengfeng
  • 浏览: 229132 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

JS实现Html File控件赋值

阅读更多

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

 

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

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

 

<input name="myfile" type="file" />    
   
<script language="JavaScript">    
window.attachEvent("onload", setfile);     
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属性值

 

在 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.aspx

               http://hi.baidu.com/78347079/blog/item/5ef6457793c0fc13b151b933.html

 

分享到:
评论
1 楼 robertzsl 2015-01-25  
已经没用了,不过总结的还不错。

相关推荐

    file控件无法赋值解决实例

    解决无法为FIle控件赋值的问题!并且支持中文赋值问题

    js 获取、清空input type=file的值(示例代码)

    )用于在客户端浏览并上传文件,用户选取的路径可以由value属性获取,但value属性是只读的,不能通过 javascript来赋值,这就使得不能通过value=””语句来清空它。很容易理解为什么只读,如果可以随意赋值的话,...

    大名鼎鼎SWFUpload- Flash+JS 上传

     file_queue_limit : 2, 上传队列数量限制,该项通常不需设置,会根据file_upload_limit自动赋值  flash_url : "http://www.swfupload.org/swfupload_f9.swf", Flash控件的URL  flash_width : "1px",  flash_...

    web真实进度条(上传时间,大小,百分比)

    ASP.NET实现进度条上传文件源码 源码说明 该程序采用了jquery框架,实现了小文件上传。 两个地方需要解释 第一,如何知道监听的这个文件就是上传的这个文件实现机制很简单,就是让asp...3.在index.htm中添加file控件

    解决layui中onchange失效以及form动态渲染失效的问题

    最近在使用layui框架做城市的三级级联的时候,发现jquery中的onchange事件方法在layui框架中失效了。 然后浏览layui社区,了解...对于动态拼接,给一个控件赋值的是否,layer也比jquery多一步。 jquery: $('#city').a

    ASP.NET2.0高级编程(第4版)1/6

    本书全面介绍了ASP.NET各种编程技能和2.0版中的... 5.12.2 给复选框赋值138  5.12.3 排列复选框的文本138 5.13 CheckBoxList服务器控件139 5.14 RadioButton服务器控件141 5.15 RadioButtonList服务器控件143 5.16 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    4.4 通过JavaScript处理页面和服务器控件 98 4.4.1 使用Page.ClientScript.RegisterClient ScriptBlock 100 4.4.2 使用Page.ClientScript.Register StartupScript 101 4.4.3 使用Page.ClientScript....

    JavaScript操作文件_动力节点Java学院整理

    在HTML表单中,可以上传文件的唯一控件就是&lt;input type=”file”&gt;。 注意:当一个表单包含&lt;input type=”file”&gt;时,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才能...

    如何将一个TXT文档里内容导入到文本框里

    &lt;font color="#009900" size="3"&gt;&lt;b&gt;JS读取文本文件的内容并赋值给textarea控件&lt;/b&gt;&lt;/font&gt; &lt;br&gt; &lt;input type="file" id="FileName" name="FileName" size="30"&gt; 导入" onclick="ajaxSubmit();"&gt; &lt;br&gt;...

    千方百计笔试题大全

    115、什么情况用HTML控件,什么情况用WEB控件,并比较两者差别 25 javaScript部分 25 116、JavaScript中的对象. 25 117、function的用法 26 118、对象的继承 27 119、this的用法 29 120、Array in JavaScript 29 ...

    java面试宝典

    115、什么情况用HTML控件,什么情况用WEB控件,并比较两者差别 25 javaScript部分 25 116、JavaScript中的对象. 25 117、function的用法 26 118、对象的继承 27 119、this的用法 29 120、Array in JavaScript 29 121...

Global site tag (gtag.js) - Google Analytics