2016-09-27 17 views
1

私の英語については残念です。Javascript、入力ファイルから読み込んでXMLHttpRequestでアップロードする

"data:application/msdownload;base64,0J/RgNC40LLQtdGCINC80LjRgCE= .... etc." 
:今、私のような変数 "myfileの" を持っている

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]); 
     } 
} 

:このような

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

読む(Javascriptの):私は、ファイル(.exe)入力ファイルが選択した自分のファイルをアップロード必要

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); 

ファイルアップロードOK。しかし、このファイルをダウンロードすると、このファイルが破損しました...エンコードとサイズが変更されました。

私はアヤックスのない私のファイルをアップロードすることができますが、私は保持する必要があります...

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

など...... が、何も変わっていない:

私はこのように異なるヘッダーを設定しようとしていましたこのファイルはlocaly ...と操作後、変数からアップロードします。

要するに

私はこのようにBase64でエンコードされた文字列があります。

0J/RgNC40LLQtdGCINC80LjRgCE= 

まあ、私はこの文字列では知っているが、ファイルのソースである "SecretFile.exe"。 javascriptを使用してこのファイルをデコードしてアップロードします。 standart window.atobでデコードされた文字列はオリジナルのファイルソースと等しくありません。 FileReaderでBase64でエンコードされたこのファイルのデコード方法

ありがとうございます。

+1

アップロードしたらOKですか?どのようにサーバーに保存しているのですか?どのようにダウンロードしていますか(そのコードは表示されていませんが、ファイルを破損する**ダウンロード**と書いてあります) –

+1

'サイズが変更されました。元のサイズは何ですか、変更されたサイズは何ですか?悪魔は詳細にあります –

+0

質問に対する回答を編集しないでください。 [回答の受け取りはどのように受け付けますか?](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)をお読みください。 – Quentin

答えて

1

ファイルをデータ文字列に読み込んだ後、Blobに変換する必要はありません。 Fileオブジェクト(<input type="file" />要素から取得したものなど)は、すでにBlobであるため、fd.appendに直接渡すことができます。

あなたがアップロードする前Fileオブジェクトをmanipuleする必要がある場合は、あなたが直接操作し、その後、単純にアップロードする前にnew Blob([ arrayBuffer ])でブロブを作成することができArrayBufferを与える代わりに、FileReaderreadAsArrayBufferメソッドを使用する必要があります。

関連する問題