網上搜索了半天也沒有完整的解決方案。
用如下方法須要添加到信任站點或解除未簽名的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