1

私のアプリには、python (bottle.py) バックエンドと html/jquery フロントエンドがあります。フォームで「入力」を使用してテキスト ファイルを取得し、Python 側のイベント ハンドラーを使用してバックグラウンドでアップロードしています。次に、イベント ハンドラーはファイルを解析し (file.readline()繰り返し呼び出します)、何らかの結果を json 形式で返します。

Pythonでファイルを解析する必要があるまで、すべてうまくいきます。

これが私のJavaScriptです:

function UploadFile() {
    var file = $('#data')[0].files[0];
    var formData = new FormData();
    formData.append("file", file);
    $.ajax({
        url: 'plates',
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data){
            ...
        }
    });
}

Python側でPOSTリクエストを受信すると、でしか読めませんrequest.body.read().decode()。しようとするとrequest.files.data.file.read()、「壊れたパイプ」エラーが発生します。

socket.error: [Errno 32] Broken pipe

でテキストを取得し、request.body.read().decode()ファイルに保存してからロードして解析できます。しかし、作成する必要のないファイルを作成することは避け、すべてをメモリ内で実行したいと考えています。

なぜ機能しrequest.body.read().decode()request.files.data.file.read()機能しないのですか?ファイルをディスクに書き込まずに、既存の関数でファイルを解析する方法はありますか?

4

2 に答える 2

1

リクエストが content-type "multipart/form-data" で送信されていることを確認することをお勧めします。デフォルトは「application/x-www-form-urlencoded」ですが、ファイルを解析しようとするときにボトルが期待するものではない可能性があります。

RFC 2388は、HTTP でのマルチパート フォーム (ファイルを含む) の処理について詳しく知りたい場合、(分厚いとはいえ) 良い情報源です。

また、jQuery を使用したファイルのアップロードに関する良い議論もここにあります。

于 2012-08-02T00:37:09.883 に答える
0

2 つの呼び出しが異なる理由はまったくわかりません (私は django を使用しています) が、ディスクに書き込まずに解析する方法は、新しい BytesIO インスタンスを取得し、それに書き込み、それをファイル ハンドルの代わりに使用することです。部分的な解決策にすぎません。

単なるテキストの場合は、代わりに StringIO の使用を検討してください

于 2012-08-01T17:50:49.827 に答える