使用BottlePy,我使用以下代码上传文件并将其写入磁盘:
它返回以下错误:
TypeError('必须是字节或缓冲区,而不是字符串',)
我猜这与二进制文件有关?
是否需要安装Python的附加组件才能上传任何文件类型?
更新
只是为了确保,如@thkang所指出的那样,我尝试使用bottlepy的dev版本和内置方法.save()编写此代码。
更新2
以下是最终代码,它“有效”(不会弹出错误
很遗憾,结果是一样的:每个
我还注意到这些文件(损坏的文件)比原始文件(上传前)要大。
这个二进制问题必须是Python 3x的问题。
注意:
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('必须是字节或缓冲区,而不是字符串',)
我猜这与二进制文件有关?
是否需要安装Python的附加组件才能上传任何文件类型?
更新
只是为了确保,如@thkang所指出的那样,我尝试使用bottlepy的dev版本和内置方法.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或其他任何处理)
.save()
方法吗? - thkangAttributeError('save',)
(我的版本是0.11.6)。 - Koffee