2016-07-23 26 views
0

我正在開發一個應用程序,它提示用戶上傳一個文件,然後可供下載。 這裏是下載處理程序:GAE Python Blobstore不在Firefox中保存包含unicode字面值的文件名

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瀏覽器,但在Firefox它保存爲以下形式的字符串「 %83%86%E3 ...「 有什麼辦法可以讓它在Firefox中正常工作嗎?

+0

是否相同的行爲與dev_appserver存在嗎?由於這個bug,我也遇到了blobstore的編碼問題; https://code.google.com/p/googleappengine/issues/detail?id=2749 – cdagli

+0

我也遇到了與此錯誤相同的問題。我通過ajax提交表單數據並通過上傳文件形式提交文件來繞過它 - 每個觸發不同的處理程序(顯然blobstore處理程序不會正確編碼unicode字面值,無論發送它們的方式如ajax還是web表單)。但是,開發應用程序服務器上也會出現文件名問題。 –

回答

1

在附件中發送帶有非ASCII字符的文件名是很困難的,因爲原始規範被破壞,瀏覽器行爲也有所不同。

你應該不是%-encoding(urllib.quote)的文件名;作爲結果,Firefox可以將其作爲文字%序列來提供。即使Chrome最終繼續複製它,IE在文件名中的%解碼序列行爲也是不正確的。

最終發送非ASCII文件名的正確方法是使用RFC6266指定的機制,其中一個頭,看起來像這樣結束:

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

但是:

    年長
  • 瀏覽器如IE8不支持它,所以如果你關心你應該通過東西作爲ASCII-only 以及;
  • 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修復它