2016-09-27 42 views
1

對不起,我的英語。我需要上傳我的輸入文件中選擇文件(.exe):Javascript,從輸入文件讀取並使用XMLHttpRequest上傳

<input type="file" id="myfile"> 

這樣寫的(JavaScript)的:

var myfile=''; 
var input = document.getElementById('myfile'); 
input.onchange = function(evt){ 
    var tgt = evt.target || window.event.srcElement, files = tgt.files; 
    if (FileReader && files && files.length) { 
      var fr = new FileReader(); 
      fr.onload = function(){ 
       myfile = fr.result; 
      } 
     fr.readAsDataURL(files[0]); 
     } 
} 

現在我有變量 「MYFILE」,如:

"data:application/msdownload;base64,0J/RgNC40LLQtdGCINC80LjRgCE= .... etc." 

在base64部分裏我有源文件,我選擇了什麼。當我嘗試上傳我的文件時,此文件的編碼和大小發生變化,文件已損壞。什麼做錯了?

上傳代碼:

var fd = new FormData(); 
    var b = new Blob([atob(decodeURIComponent((myfile).split(',')[1]))],{type: 'application/msdownload'}); 
    fd.append('file', b, "myfile.exe"); 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", "http://myserver/"); 
    xhr.send(fd); 

上傳文件確定。但是當我下載這個文件,這個文件損壞了......編碼和大小改變了。

我試圖設置不同的標題是這樣的:

xhr.setRequestHeader("Content-Type", "charset=windows-1251"); 
............. 
xhr.setRequestHeader("Content-Type", "charset=utf-8"); 

等...... 但什麼都沒有改變......

我可以上傳我的文件沒有Ajax,但我需要持有這個文件localy ...並在操作後從變量上傳它。

簡而言之:

我在Base64編碼的像這樣的字符串:

0J/RgNC40LLQtdGCINC80LjRgCE= 

嗯,我知道在這個字符串文件 「SecretFile.exe」 的來源。 我想用javascript解碼並上傳這個文件。使用標準window.atob解碼的字符串不等於原始文件源。如何真正解碼此文件,由FileReader中的Base64編碼。

謝謝。

+1

上傳文件就OK了嗎?你如何將它存儲在服務器上,你如何下載它(你沒有顯示該代碼,但你說它是**下載**破壞文件) –

+1

'size changed' - 多少?什麼是原始尺寸,改變後的尺寸是多少 - 魔鬼在細節中 –

+0

不要將答案編輯成問題。請閱讀[如何接受答案的工作?](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work) – Quentin

回答

1

您不必將文件讀取到數據字符串,然後將其轉換爲Blob。任何File對象(例如您從<input type="file" />元素獲得的對象)也將是Blob,因此您可以直接將其傳遞給fd.append

如果需要manipule上傳前File對象,您應該使用FileReaderreadAsArrayBuffer方法來代替,它給你的ArrayBuffer,你可以直接操作,然後只需上傳之前創建一個blob與new Blob([ arrayBuffer ])

相關問題