試圖上傳文件到S3具有:Boto3 S3:類型錯誤:脅迫爲Unicode:需要字符串或緩衝區,文件中發現
# boto3 s3 client
s3.put_object(Bucket=self.bucket,
Body=open(upload_file, 'rb'),
Key=k.key,
SSECustomerAlgorithm='AES256',
SSECustomerKey=base64.b64encode(data_key),
SSECustomerKeyMD5=base64.b64encode(data_key_md5)
)
,並在此行得到了錯誤:
TypeError: coercing to Unicode: need string or buffer, file found
我upload_file
變量<type 'file'>
與dir
:
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
切換到open(upload_file, 'rb').read()
不會幫助。另外我的文件可能很大(如此1GB),將它們保存爲字符串是不合理的。
我知道它會工作,如果我將upload_file
設置爲文件路徑,但我沒有這個文件在磁盤上,它通過表單提交。
UPDATE
它的怪異,但是當我使用的測試文件或字符串(測試的緣故)得到了類似的問題:
TypeError: expected string or buffer
這是響應爲:
# boto3 s3 client
s3.put_object(Bucket=self.bucket,
# put existing filr
Body=open('/tml/existing-file', 'rb'), # adding read() wont help
# ...
)
相同的字符串:
# boto3 s3 client
s3.put_object(Bucket=self.bucket,
# put existing filr
Body='some random string',
# ...
)
當你設置'Body = open(upload_file,'rb')。read()'?時,你會得到什麼錯誤? – wpercy
@wilbur '*** TypeError:強制轉換爲Unicode:需要字符串或緩衝區,找到文件'此文件來自窗體,'<打開文件'',模式'w + b'*** **** –
如果只是將'upload_file'傳遞給'Body'而不是試圖打開它呢? – wpercy