【发布时间】:2015-01-09 05:15:52
【问题描述】:
我尝试使用文件名作为对象名称将文件上传到 GCS。
例如 文件名是“test”,所以对象是“test”。
但是有些文件的文件名不是纯 ASCII 字符,我会得到如下异常:
Traceback (most recent call last):
File "test_oauth.py", line 303, in <module>
file_upload(sys.argv[2], sys.argv[3])
File "test_oauth.py", line 188, in file_upload
bucket=bucket_name, name=object_name, media_body=media)
File "./package/src/shared/python-lib/apiclient/discovery.py", line 640, in method
File "./package/src/shared/python-lib/apiclient/model.py", line 137, in request
File "./package/src/shared/python-lib/apiclient/model.py", line 171, in _build_query
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 3: ordinal not in range(128)
如果文件名是 UTF-8 字符串,我认为对象名称将被邮寄: https://cloud.google.com/storage/docs/bucketnaming
而且我确定文件名是 utf-8 编码。
我应该如何处理这种情况?
我不想将文件名转换为其他编码,例如 base64。
这里是sn-p的代码:
def file_upload(file_name=None, bucket_name=get_bucket_name()):
assert file_name and bucket_name
object_name = get_object_name(file_name)
print '%s: upload file: %s to bucket: %s to object: %s' % (
sys._getframe().f_code.co_name, file_name, bucket_name, object_name)
media = MediaFileUpload(file_name, chunksize=CHUNKSIZE, resumable=True)
service = get_authenticated_service()
print "mimetype: %s" % media.mimetype()
if not media.mimetype():
media = MediaFileUpload(FILE_UPLOAD,
mimetype=DEFAULT_MIMETYPE,
resumable=True)
print 'object_mame: %s' % object_name
request = service.objects().insert(
bucket=bucket_name, name=object_name, media_body=media)
object_name 等于文件名,我确定系统编码是 UTF-8。
谢谢!
【问题讨论】:
-
name=object_name.encode('utf8')工作吗? -
不,我尝试进行编码但仍然得到相同的异常。即使我尝试先对其进行解码以使其返回 unicode 对象,它仍然会出现相同的错误。
-
目前如果存在多字节字符,我会更改文件名,现在可以正常工作。我只是想知道为什么使用 UTF-8 编码的文件名会失败。
标签: python google-cloud-storage