10

かなり大きなファイルをアップロードするためにボトルを使用しています。ファイルがアップロードされると、Web アプリは、アップロードされたファイル パスを引数としてシステム コマンドを実行する (そして忘れる) という考え方です。正しいファイル パスを引数としてシステム コマンドを開始する場合を除いて、ファイルを保存する必要はありませんが、プロセスが処理を完了するまでファイルが使用可能であることを確認する必要があります。

ここで説明されている正確なコードを使用します: http://bottlepy.org/docs/dev/tutorial.html#post-form-data-and-file-uploads

私の質問は次のとおりです。

  • ボトルは、アップロードされたファイルをメモリまたはディスク上の特定の場所に保存しますか (または、Flask のように、両方のビット)?
  • アップロードされたファイルは、.read() を使用せずに他のツールで直接利用でき、ディスク上の指定されたファイルにバイトを手動で保存できますか?
  • ファイルを引数としてシステムコマンドを開始する最良の方法は何ですか? 既存のファイルへのパスを直接渡すことは可能ですか?
4

4 に答える 4

19

さて、これを分解しましょう。

完全なコードは次のとおりです。

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にない場合は、これらの「ツール」にデータを渡すためのパイプまたはサブプロセスを処理している可能性があります。

于 2013-01-12T18:45:55.603 に答える
4
 with open(filename,'w') as open_file:
    open_file.write(data.file.read())

働かない

あなたが使用することができます

data = request.files.data
data.save(Path,overwrite=True)
于 2015-09-09T06:32:03.493 に答える
1

ファイルは、使用するルーチンによって処理されます。つまり、読み取りが接続を処理することを意味します (wsgi 仕様によると、ファイルは存在しないはずです)。

于 2013-10-08T12:10:22.750 に答える
0
with open(filename, "wb") as file:
  Data = data.file.read()
  if type(Data) == bytes: file.write(Data)
  elif type(Data) == str: file.write(Data.encode("utf-8"))

簡単 :D

于 2020-06-15T03:26:19.537 に答える