使用 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
... 已损坏
我还注意到这些文件(损坏的文件)比原始文件(上传之前)的大小更大
这个二进制的东西一定是 Python 3x 的问题
笔记 :
我使用 python 3.1.3
我使用 BottlePy 0.11.6(原始的 bottle.py 文件,上面没有 2to3 或任何东西)