首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError u'\xae‘与S3 generate_url

KeyError u'\xae‘与S3 generate_url
EN

Stack Overflow用户
提问于 2015-02-18 10:21:58
回答 1查看 560关注 0票数 1

我想为一个S3对象生成一个签名的URL,其中包含®的下载文件名,但是它会引发一个错误:

代码语言:javascript
复制
    content_disposition = u'attachment; filename={}'.format(upload.filename)
    url = conn.generate_url(
        EXPIRES_IN,
        'GET',
        S3_PROTECTED_BUCKET_NAME,
        upload.file_key,
        response_headers = {
            'response-content-type': content_type,
            'response-content-disposition': content_disposition
        })

违规字符串repr是:

u'attachment; filename=Rita-PMP\xae Exam Prep 8th Edition - Rita Mulcahy.png'

它的print适用于。

它引发以下错误:

代码语言:javascript
复制
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "/home/likewise-open/SUYATITECH/jjvattamattom/dev/force4change/projectapp/views.py" in show
  203.         attachment.file_key = signed_download_url(attachment)
File "/home/likewise-open/SUYATITECH/jjvattamattom/dev/force4change/baseapp/uploads.py" in signed_download_url
  69.             'response-content-disposition': content_disposition
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py" in generate_url
  399.                 extra_qp.append("%s=%s" % (k, urllib.parse.quote(v)))
File "/usr/lib/python2.7/urllib.py" in quote
  1288.     return ''.join(map(quoter, s))

Exception Type: KeyError at /projects/show/50
Exception Value: u'\xae'

为什么它抛出这个错误时,符号是很容易的ASCII?

更新:传递编码的字节字符串也不起作用:

代码语言:javascript
复制
content_disposition = 'attachment; filename={}'.format(upload.filename.encode('utf-8'))

给我:

代码语言:javascript
复制
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "/home/likewise-open/SUYATITECH/jjvattamattom/dev/force4change/projectapp/views.py" in show
  203.         attachment.file_key = signed_download_url(attachment)
File "/home/likewise-open/SUYATITECH/jjvattamattom/dev/force4change/baseapp/uploads.py" in signed_download_url
  69.             'response-content-disposition': content_disposition
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py" in generate_url
  407.         b64_hmac = self._auth_handler.sign_string(c_string)
File "/usr/local/lib/python2.7/dist-packages/boto/auth.py" in sign_string
  91.         new_hmac.update(string_to_sign.encode('utf-8'))

Exception Type: UnicodeDecodeError at /projects/show/50
Exception Value: 'ascii' codec can't decode byte 0xc2 in position 130: ordinal not in range(128)
EN

回答 1

Stack Overflow用户

发布于 2015-02-18 11:58:52

在将content-disposition头传递给generate_url之前,您应该对它进行编码(urllib没有使用unicode):

代码语言:javascript
复制
>>> content_disposition = u'attachment filename=Rita-PMP\xae Exam Prep 8th Edition - Rita Mulcahy.png'
>>> urllib.quote(content_disposition)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib.py", line 1288, in quote
    return ''.join(map(quoter, s))
KeyError: u'\xae'
>>> urllib.quote(content_disposition.encode('utf-8'))
'attachment%20filename%3DRita-PMP%C2%AE%20Exam%20Prep%208th%20Edition%20-%20Rita%20Mulcahy.png'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28581135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档