Chrome 28 で動作しない拡張機能があります。拡張機能を使用して、あるコンテキストから別のコンテキストに BLOB を渡すことに関して、セキュリティ アップデートがあったと思います。これを確認し、その場合の回避策を見つけようとしています。どんな助けでも大歓迎です。
オブジェクトのタイプが Blob または File オブジェクトでない場合、文字列に変換されることを MDN で読みました....これが起こっていることだと思います。https://developer.mozilla.org/en-US/docs/Web/API/FormData
クロム 28
ファイルが正しく取得され、ファイル サイズが正しい。タイプ、コンソールログ、プロトタイプのチェックなどを確認すると、すべてが正しいように見えます。ブロブ サイズはファイル サイズと一致します。すべてが同じウィンドウで行われる場合、サーバーが受け取るのはファイル データです。拡張子を介した場合、サーバーはこの文字列「[object Blob]」を受け取り、要求の実際のサイズは、ファイル サイズではなく、文字列「[object Blob]」のバイト数になります。
クロム 23
ファイルが正しく取得され、ファイル サイズが正しい。タイプ、コンソールログ、プロトタイプのチェックなどを確認すると、すべてが正しいように見えます。すべてが同じウィンドウで行われる場合、サーバーが受け取るのはファイル データです。拡張子を介している場合は、すべて正常に動作し、ファイル データが受信されます。BLOB のサイズと実際のファイル サイズは、コンソールで調べたときと、サーバーに送信したときに一致します。
以下は不自然な例です。私が議論していることを再現するのに役立つことを願っています. そうでない場合は、私に知らせてください。テストできるように、私の個人用サーバーに作業コピーをアップロードします。
拡張タブ
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost/someImage.png', true);
xhr.responseType = 'blob';
xhr.onload = function (response, status, request) {
if (xhr.readyState === 4) {
if (this.response) {
var blob = new Blob([this.response], { type: 'application/png' });
blob.name = 'someImage.png';
window.imageBlob = blob; // For testing
} else {
downloadError(response);
}
}
};
xhr.onerror = function (e) {
downloadError(e);
}
xhr.send(null);
メインタブ
var formData = new FormData();
formData.append('file', imageBlob, imageBlob.name);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost/upload.php', true);
xhr.onload = function (e) {
console.log('response', xhr.responseText);
}
xhr.send(formData);
バックエンド
<?php
print_r($_FILES, true);
?>