BottlePyを使用して、次のコードを使用してファイルをアップロードし、ディスクに書き込みます。
upload = request.files.get('upload')
raw = upload.file.read()
filename = upload.filename
with open(filename, 'w') as f:
f.write(raw)
return "You uploaded %s (%d bytes)." % (filename, len(raw))
毎回適切なバイト数を返します。
アップロードは、、、...などのファイルに対して正常に機能します.txt
。.php
.css
.jpg
ただし、、、、、などの他のファイルのファイルが破損する結果になり.png
ます。.pdf
.xls
open()
機能を変えてみました
with open(filename, 'wb') as f:
次のエラーが返されます。
TypeError('strではなくバイトまたはバッファである必要があります'、)
バイナリファイルに関連する問題だと思いますか?
任意のファイルタイプのアップロードを実行するためにPythonの上にインストールするものはありますか?
アップデート
念のために言っておきますが、@ thkangが指摘しているように、開発バージョンのbottlepyと組み込みのメソッド.save()を使用してこれをコーディングしようとしました。
upload = request.files.get('upload')
upload.save(upload.filename)
まったく同じ例外エラーを返します
TypeError('must be bytes or buffer, not str',)
アップデート2
ここで「機能する」(そしてエラーをポップしない)最終的なコードTypeError('must be bytes or buffer, not str',)
upload = request.files.get('upload')
raw = upload.file.read().encode()
filename = upload.filename
with open(filename, 'wb') as f:
f.write(raw)
残念ながら、結果は同じです。すべてのファイルは正常に機能しますが、、 ...など.txt
の他のファイルは破損しています。.jpg
.pdf
また、これらのファイル(破損したファイル)のサイズが元のファイル(アップロード前)よりも大きいことに気付きました。
このバイナリのことはPython3xの問題であるに違いありません
ノート :
私はPython3.1.3を使用しています
私はBottlePy0.11.6を使用しています(生のbottle.pyファイル、2to3などはありません)