2014-11-23 34 views
0

我正在使用Turbogears 2.3.3
在web應用程序中在我的應用程序中,用戶將得到一組指示,並且他們將需要相應地下載一些文件。
重要的是,他們將能夠下載與他們的原始名稱,將在utf8中的文件。 這裏是我的下載文件的方法: Turbogears響應 - 發送utf-8文件名

import os 
from webob.static import FileApp 
from tg import expose, request, use_wsgi_app, response 

.... 

@expose() 
def download(self,**kw): 
    response.headerlist.append(('Content-Disposition','attachment')) 
    path_to_file = os.path.join(os.path.dirname(dfuswebapp.__file__), 'PrintFiles') 
    file_with_path = os.path.join(path_to_file,kw['filename']) 
    file = FileApp(file_with_path) 
    return use_wsgi_app(file) 

當我試圖得到一個這樣的文件,文件名是「下載」與原文件的擴展名。

如果我試試這個代碼:

response.headerlist.append(('Content-Disposition','attachment;filename=%s'%str(kw['filename']))) 

我得到一個錯誤,如果千瓦[「名」]是UTF-8,其中大部分我的檔案會。 有沒有一種方法有原始文件名?

感謝您的幫助

回答

1

很遺憾,您遇到了WSGI和HTTP中許多黑暗角落中的一個。 如上所述通過WSGI規範:

還要注意,傳遞給start_response字符串(),爲狀態或作爲 響應頭必須遵循RFC 2616相對於編碼。即 是,它們必須是ISO-8859-1字符,或使用RFC 2047 MIME 編碼。

這意味着你的頭應該被編碼爲latin-1或使用RFC2047,問題是,隨着瀏覽器不以可靠的方式表現,對於Latin-1以外的頭支持已被冷落的WebOb至今(見https://github.com/Pylons/webob/issues/11#issuecomment-2819811)。

最佳解決方案可能是手動編碼使用RFC6266其用於使用percentage encoding unicode編碼提供filename*Content-Disposition報頭。這將提供完全符合拉丁-1的結果,使WSGI開心,並且可以表示unicode UTF8字符。

下面是一個簡單的例子這給「EURO率」,並根據瀏覽器「€率」:

Content-Disposition: attachment; 
          filename="EURO rates"; 
          filename*=utf-8''%e2%82%ac%20rates 

參見這個帖子StackOverflow上有關此問題的討論: How to encode the filename parameter of Content-Disposition header in HTTP?