【问题标题】:Fail to insert object with UTF-8 file name by python无法通过 python 插入具有 UTF-8 文件名的对象
【发布时间】: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


【解决方案1】:

根据this post,您需要先通过 urllib.quote() 传递名称,它应该可以工作

【讨论】:

  • 它可以在上传多字节文件名时使用,格式为:%SDF....,但上传后的文件也会显示引用名称。因为我没有上传元数据,这对这个问题有影响吗?
  • 不应该。我在最后进行了测试,我看到的唯一问题是当我 dled 文件时,Windows 用破折号替换了引号
  • 好的,我会继续测试这个,我认为那是因为我使用的库不支持。我应该详细跟踪 apiclient 库。谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2016-02-22
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
相关资源
最近更新 更多