1

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などはありません)

4

2 に答える 2

2

read()Python 3xでは、すべての文字列がUnicodeになっているため、このファイルアップロードコードで使用されている関数を変換する必要があります。

この関数はUnicode文字列も返します。これは、関数read()を介して適切なバイトに変換できます。encode()

私の最初の質問に含まれているコードを使用して、行を置き換えます

raw = upload.file.read()

raw = upload.file.read().encode('ISO-8859-1')

それで全部です ;)

さらに読む: http: //python3porting.com/problems.html

于 2013-03-19T08:39:32.750 に答える
1

これを試して:

upload = request.files.get('upload')

with open(upload.file, "rb") as f1:
    raw = f1.read()
    filename = upload.filename
    with open(filename, 'wb') as f:
        f.write(raw)

    return "You uploaded %s (%d bytes)." % (filename, len(raw))

アップデート

試してみてくださいvalue

# Get a cgi.FieldStorage object
upload = request.files.get('upload')

# Get the data
raw = upload.value;

# Write to file
filename = upload.filename
with open(filename, 'wb') as f:
    f.write(raw)

return "You uploaded %s (%d bytes)." % (filename, len(raw))

アップデート2

このスレッドを参照してください、それはあなたが試みているものと同じように見えます...

# Test if the file was uploaded
if fileitem.filename:

   # strip leading path from file name to avoid directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('files/' + fn, 'wb').write(fileitem.file.read())
   message = 'The file "' + fn + '" was uploaded successfully'

else:
   message = 'No file was uploaded'
于 2013-03-17T11:37:55.563 に答える