コメントされているように、この投稿Liam Kelly
のスニペットは機能するはずです。を使用すると、ファイル メタデータを明示的に送信しなくても簡単に送信できます。Klein/Twisted アプローチは次のようになります。cgi.FieldStorage
from cgi import FieldStorage
from klein import Klein
from werkzeug import secure_filename
app = Klein()
@app.route('/')
def formpage(request):
return '''
<form action="/images" enctype="multipart/form-data" method="post">
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
'''
@app.route('/images', methods=['POST'])
def processImages(request):
method = request.method.decode('utf-8').upper()
content_type = request.getHeader('content-type')
img = FieldStorage(
fp = request.content,
headers = request.getAllHeaders(),
environ = {'REQUEST_METHOD': method, 'CONTENT_TYPE': content_type})
name = secure_filename(img[b'datafile'].filename)
with open(name, 'wb') as fileOutput:
# fileOutput.write(img['datafile'].value)
fileOutput.write(request.args[b'datafile'][0])
app.run('localhost', 8000)
何らかの理由で、私の Python 3.4 (Ubuntu 14.04) バージョンはcgi.FieldStorage
正しい結果を返しません。これを Python 2.7.11 でテストしたところ、問題なく動作しました。そうは言っても、フロントエンドでファイル名やその他のメタデータを収集し、それらを ajax 呼び出しで klein に送信することもできます。こうすれば、バックエンドであまり多くの処理を行う必要がなくなります (これは通常は良いことです)。または、werkzeug が提供するユーティリティの使用方法を理解することもできます。関数werkzeug.secure_filename
およびrequest.files
(つまりFileStorage
) の実装または再作成は特に難しくありません。