さて、これを分解しましょう。
完全なコードは次のとおりです。
HTML:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="file" name="data" />
</form>
Pythonコード:
from bottle import route, request
@route('/upload', method='POST')
def do_upload():
name = request.forms.name
data = request.files.data
if name and data and data.file:
raw = data.file.read() # This is dangerous for big files
filename = data.filename
return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))
return "You missed a field."
(あなたが提供したドキュメントから)
したがって、まず最初に、htmlフォームのname
とから情報を取得しdata
、それらを変数name
とに割り当てていることがわかりますdata
。それはかなり簡単です。ただし、次に変数をに割り当てraw
ますdata.file.read()
。これは基本的に、アップロードされたすべてのファイルを変数に取り込みますraw
。そうは言っても、ファイル全体がメモリ内にあるため、行の横に「これは大きなファイルにとって危険です」というコメントを付けています。
そうは言っても、ファイルをディスクに保存したい場合は、次のようなものを使用して保存できます(ただし注意してください)。
with open(filename,'w') as open_file:
open_file.write(data.file.read())
あなたの他の質問に関して:
1.「ファイルを引数としてシステムコマンドを開始する最良の方法は何ですか?既存のファイルへのパスを直接渡すことは可能ですか?」
subprocess
モジュールが表示されます。具体的には、http Popen
://docs.python.org/2/library/subprocess.html#popen-constructorです。
2.「アップロードされたファイルは、.read()を使用せずに他のツールで直接利用でき、手動でバイトをディスク上の指定されたファイルに保存しますか?」
はい、ディスクに保存せずにファイルデータを渡すことができますが、メモリ消費量には注意が必要です。ただし、これらの「ツール」がPythonにない場合は、これらの「ツール」にデータを渡すためのパイプまたはサブプロセスを処理している可能性があります。