【问题标题】:GAE Python Blobstore doesn't save filename containing unicode literals in Firefox onlyGAE Python Blobstore 仅在 Firefox 中不保存包含 unicode 文字的文件名
【发布时间】:2016-07-23 14:17:20
【问题描述】:

我正在开发一个应用程序,它会提示用户上传一个文件,然后可以下载该文件。 这是下载处理程序:

class ViewPrezentacje(blobstore_handlers.BlobstoreDownloadHandler, BaseHandler):
    def get(self,blob_key):
        blob_key = str(urllib.unquote(blob_key))
        blob_info=blobstore.BlobInfo.get(blob_key)
        self.send_blob(blob_info, save_as=urllib.quote(blob_info.filename.encode('utf-8')))

使用 Chrome 或 IE 时以正确的文件名下载文件(即正确显示 unicode 文字),但在 Firefox 中它被保存为格式为“%83%86%E3...”的字符串 有没有办法让它在 Firefox 中正常工作?

【问题讨论】:

  • dev_appserver 是否也存在相同的行为?由于这个错误,我还遇到了 blobstore 的编码问题; code.google.com/p/googleappengine/issues/detail?id=2749
  • 我遇到了同样的问题。我通过 ajax 提交表单数据和通过上传文件表单提交文件来规避它 - 它们每个都触发不同的处理程序(显然 blobstore 处理程序没有正确编码 unicode 文字,无论发送它们的方式是 ajax 还是 web 表单)。但是,文件名问题也出现在 dev 应用服务器上。

标签: python python-2.7 google-app-engine firefox unicode


【解决方案1】:

在附件中发送带有非 ASCII 字符的文件名非常困难,因为原始规范已被破坏并且浏览器行为也有所不同。

您不应该对文件名进行 %-encoding (urllib.quote);因此,Firefox 将其作为文字 % 序列提供是正确的。 IE 在文件名中的 %-decoding 序列的行为是不正确的,即使 Chrome 最终继续复制它。

最终,发送非 ASCII 文件名的正确方法是使用RFC6266 中指定的机制,最终得到如下所示的标头:

Content-Disposition: attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html

但是:

  • IE8 等较旧的浏览器不支持它,所以如果您愿意,也应该将 something 作为纯 ASCII 的 filename= 传递;
  • BlobstoreDownloadHandler 不知道这种机制。

BlobstoreDownloadHandler 需要修复的地方是send_blob中的这个内部函数:

def send_attachment(filename):
  if isinstance(filename, unicode):
    filename = filename.encode('utf-8')
  self.response.headers['Content-Disposition'] = (
      _CONTENT_DISPOSITION_FORMAT % filename)

真正想做的事:

rfc6266_filename = "UTF-8''" + urllib.quote(filename.encode('utf-8'))
fallback_filename = filename.encode('us-ascii', 'ignore')
self.response.headers['Content-Disposition'] = 'attachment; filename="%s"; filename*=%s' % (rfc6266_filename, fallback_filename)

但不幸的是,作为一个内部函数,尝试在子类中进行修复很烦人。你可以:

  • 覆盖整个send_blob 以替换send_attachment 内部函数
  • 或者你可以在调用send_blob 之后像这样写self.response.headers['Content-Disposition']?我不确定 GAE 是如何处理这个问题的
  • 或者,可能是最实用的,暂时放弃使用 Unicode 文件名,直到 GAE 修复它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 2013-11-07
    • 2012-03-11
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2016-07-22
    相关资源
    最近更新 更多