2016-07-05 4 views
5

この質問に関連しているとBlob継承Fileオブジェクトを含むfiles特性を有する<input type="file">要素考えるHow to updoad in old browsers (ex Safari 5.1.4)FileReaderを使用せずにBlobオブジェクトとFileオブジェクトからArrayBufferとデータURIを作成するにはどうすればよいですか?

触発され、それが可能ArrayBufferを作成しBlob又はFileからdata URIArrayBufferを変換することですオブジェクトを使用せずにFileReader

アプローチはこれまで

  • FileオブジェクトにMessageEventevent.data付きセットを作成し、"arraybuffer".binaryTypeセットとモックWebSocketを作成してきた試みました。結果は、ArrayBufferからFileUint8Arrayonmessageハンドラ

  • セットのプロトタイプでFileオブジェクトです。結果はUncaught TypeError: Method get TypedArray.prototype.byteLength called on incompatible receiver [object Object]()

  • FormDataオブジェクト、にリクエストボディを投稿しようとすると、確かによく考えないでFileを設定し、Uncaught TypeError: Method ArrayBuffer.prototype.byteLength called on incompatible receiver #<ArrayBuffer>()です。 plnkr

期待される結果の結果Bad Requestは:data URLに、その後TypedArrayBlobFileオブジェクトを変換する、または直接にdata URL

<!DOCTYPE html> 
<html> 

<head> 
</head> 

<body> 
    <form method="get" entype="multipart/form-data" target="binaryFrame"> 
    <input id="#avatar" type="file" name="file" /> 
    <input type="submit" /> 
    </form> 
    <iframe name="binaryFrame"></iframe> 
    <script> 
    var input = document.querySelector("input[type=file]"); 
    input.addEventListener("change", handleFiles, true); 
    // see http://jsfiddle.net/adamboduch/JVfkt/ 
    var sock = new WebSocket("ws://mock"); 
    sock.binaryType = "arraybuffer"; 
    sock.onerror = function(e) { 
     console.log("sock error", e); // ignore, here 
     } 

    sock.onmessage = function(e) { 
     console.log("socket message", e.data, e.data instanceof ArrayBuffer); 
    }; 

    function handleFiles(evnet) { 
     var file = event.target.files[0]; 
     sock.dispatchEvent(new MessageEvent("message", { 
     data: file 
     })); 
     var data = new FormData(); 
     data.append("file", file); 
     document.forms[0].action = data; 
    } 
    </script> 
</body> 

</html> 

Display image from blob using javascript and websocketsHow can you encode a string to Base64 in JavaScript?を参照してください。興味深いことに今のように尋ねているような皮肉な質問https://stackoverflow.com/questions/34302231/is-there-any-way-to-convert-the-file-to-an-arraybuffer-without-filereader-api; Blob.slice() methodそれはURL.createObjectURL(

をサポートしている場合、FileReader.readAsDataURL() method

+0

私はサファリ5を手元には持っていません(btwこのブラウザは長年使用されていませんが、ユーザーは最新のASAPに変更する必要があります)、 'Blob'オブジェクトをサポートするブラウザ)しかし 'FileReader'をサポートしていません。本当に存在しますか?あなたは間違った方向を見ていませんか? (1つの回避策は、ファイルをどこかにアップロードしてからXHRで再読み込みしますが、最初にこれらの最初の質問に答えてください) – Kaiido

+1

@Kaiido _ "またはBlobオブジェクト(またはFile)をサポートしていてもFileReaderをサポートしていないブラウザではありません。それは本当に存在していますか?」ここではサファリにアクセスできない。 MDNブラウザの互換性によると、 'はサファリのバージョン1.0でサポートされ、Blobは5.1で、FileReaderは6でサポートされています。0; 'responseType'' 'blob ''と '' arraybuffer''を 'XMLHttpRequest'状態' 'Yes''に置き換えます。 rawデータが実際に格納され、 'Blob'オブジェクト内でどのようにアクセスされるのか不思議ですか? – guest271314

+0

おそらく初期の実装...おそらくURL.createObjectURLをサポートしていないのですが、それ以外の場合は という単純なものを試してみることもできます。var url = URL.createObjectURL(blob); var xhr = new XMLHttpRequest(); xhr.onload = function(){ rawData = this.response; (get、url) xhr.send(); '。 IEは初期の実装について話していますが、IE9はTypedArrayをサポートしていませんが、キャンバスの 'imageData'オブジェクトを通して1種類も持っています。 – Kaiido

答えて

1

)は(createObjectURLを試すことができます)静的メソッドは、パラメータで指定されたオブジェクトを表すURLを含むのDOMStringを作成し、あなたはどんなイメージのURLを取得することができ、ユーザーを文書化アップロードが、そのバイナリならば、それは単に、ダウンロードが開始されます

var files = fileupload.files; //get all files 

for (var i = 0; file = files[i]; i++) 
    url= window.URL.createObjectURL(file); //gives url to files you can embed 

https://jsfiddle.net/y2u6hzb7/

それだけでリンクを開くTXT参照するには、リンクとそうでないビン配列を作成します新しいタブ。

+0

オリジナルの質問_を参照してくださいどのように"FileReader'を使わずに' Blob'と 'File'オブジェクトから' ArrayBuffer'と 'dataURI'を作成しますか?' _ 'URL.createObjectURL()'は 'Blob'を' ArrayBuffer'または 'data URI'に変換しません – guest271314

関連する問題