2

一部のページに埋め込むクロム拡張コンテンツスクリプトを作成しています。特定のファイルタイプのリンク(.doc、.torrentなど)がある場合、そのファイルをダウンロードし、Python WebにファイルPOSTを実行しますそのファイルを保存するサーバー。Python サーバーは動作しており、通常の multipart/form-data POST リクエストを処理し、作成した html インターフェイスを使用するとファイルを正常に保存します。

ファイルを適切にダウンロードするjavascriptがあります:

var req = new XMLHttpRequest();
req.open('GET', 'http://foo.com/bar.torrent', false);
req.overrideMimeType('text/plain; charset=x-user-defined');
req.send(null);
if (req.status != 200) return '';
var response = req.responseText;

そして、POSTリクエストを作成してアップロードしようとすると

// Define a boundary, I stole this from IE but you can use any string AFAIK
var boundary = "---------------------------7da24f2e50046";
var xhr = new XMLHttpRequest();
var body = '--' + boundary + '\r\n'
         // Parameter name is "file" and local filename is "temp.txt"
         + 'Content-Disposition: form-data; name="upfile";'
         + 'filename="temp.torrent"\r\n'
         // Add the file's mime-type
         + 'Content-type: application/bittorrent\r\n\r\n'
         + response + '\r\n';
         //+ boundary + '--';
xhr.open("POST", "http://python.server/", true);
xhr.setRequestHeader(
    "Content-type", "multipart/form-data; boundary="+boundary

);
xhr.onreadystatechange = function ()
{
    if (xhr.readyState == 4 && xhr.status == 200)
        alert("File uploaded!");
}
xhr.send(body);

正常にアップロードされたと思いますが、ファイルを開こうとすると、データが壊れていると表示されます。これはある種のエンコーディングの問題だと思いますが、100% 確実ではありません。

どんな考えでも非常に役に立ちます。

4

1 に答える 1

2

すべてのバイナリ文字が UTF-8 としてエンコードされているため、アップロード方法は機能しません。この質問の回答に説明と解決策を投稿しました。

あなたの場合、投稿データを手動で作成する必要はありません。スマートな方法で初期データをリクエストし、FormDataオブジェクトを使用してバイナリ データを送信します。例えば:

var x = new XMLHttpRequest();
x.onload = function() {
    // Create a form
    var fd = new FormData();
    fd.append("upfile", x.response); // x.response is a Blob object

    // Upload to your server
    var y = new XMLHttpRequest();
    y.onload = function() {
        alert('File uploaded!');
    };
    y.open('POST', 'http://python/server/');
    y.send(fd);
};
x.responseType = 'blob';    // <-- This is necessary!
x.open('GET', 'http://foo.com/bar.torrent', true);
x.send();

注:最初のリクエストで交換falseしました。リクエストを非同期で作成することも可能な場合は、true同期を使用しないでください。XMLHttpRequest

答えがわからない場合は、詳細な説明付きの例を次に示します。

于 2012-12-14T22:36:06.957 に答える