无法通过python插入具有UTF-8文件名的对象

时间:2014-11-26 07:08:26

标签: python google-cloud-storage

我尝试使用文件名作为对象名称将文件上传到GCS。

e.g。 filename是" 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。

以下是代码段:

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等于filename,我确定系统编码是UTF-8。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据this post,您需要首先通过urllib.quote()传递名称并且它应该正常工作