0

mod_wsgi を使用して xml ファイルをアップロードできるように設定しようとしています。そうするために、私はこのような式を構築します:

 <form action="upload.py" method="post" enctype="multipart/form-data">
      <input name="file" type="file" accept="text/xml"><br/>
      <input type="submit" value="upload">
 </form>

とファイルupload.py

 ..
 form = cgi.FieldStorage(fp=environ['wsgi.input'], 
                         environ=environ, 
                         keep_blank_values=True)
 fileitem = form['file']
 ..

ただし、これにより、フォームで「ファイル」にアクセスしているときにキーエラーが発生します。印刷environ['wsgi.input'].read(request_body_size)ショー:

------WebKitFormBoundaryeplWkFZe2clFMtgf
Content-Disposition: form-data; name="file"; filename="file.xml"
Content-Type: application/octet-stream

<?xml version="1.0" ?>
....

結果として、 wsgi.input は有効なようです。デバッグはそれを明らかにしcgi.FieldStorage() = FieldStorage(None, None, [])ます。問題がどこにあるのか考えていますか?私は何かを逃していますか?

4

1 に答える 1

1

私は同じことに気づき、行を配置しました:

request_body_size = int( environ.get('CONTENT_LENGTH') )
print environ['wsgi.input'].read(request_body_size)

cgi.FieldStorage()withを引数として呼び出す前にwsgi.input、本体を表示します。どうやらそのwsgi.inputfileIO オブジェクトは FS 内で消費され、その後それを読み取ることができなくなります。FSで使用する前に2回読み取ろうとしましたが、同じことが起こり、最初にしか機能しません。

編集: はい、さらに悪いことに、 wsgi.input は .seek() メソッドを実装して最初に巻き戻していません。合理的な唯一の方法は、そのコピーを io.BytesIO クラス インスタンスに作成し、それを FSにフィードすることです。後で .seek() で巻き戻すことができます。StringIO を使用することもできますが、バイナリ ファイルをアップロードしている場合は機能しないことに注意してください。

于 2018-03-05T12:15:59.870 に答える