2012-03-02 71 views
3

我想用Django的httpresponse方法下載文件。該文件的名稱有一些特殊字符,如中文。我可以用下面的代碼下載文件,但文件名稱顯示爲「%E6%B8%B8%E6%88%8F%E6%B5%8F%E8%A7%88%E5%99%A8%E6% B3%A8%E5%86%8C%E9%A1%B5%E9%9D%A2.jpg」。使用HttpResponse在Django中下載名稱中包含中文字符的文件

誰能告訴我如何轉換文件名?

response = HttpResponse(attachment.file, content_type='text/plain',mimetype='application/octet-stream') 

response['Content-Disposition'] = "attachment; filename="+urlquote(filename) 
return response 

編輯

另一個問題用smart_str時出來,文件名可以正常在Firefox和Chrome中顯示,但不是在IE:在IE中它仍然顯示了一些未知字符。有誰知道如何解決這個問題?

在此先感謝!

---通過使用urlquotesmart_str解決IE和其他瀏覽器的不同。

+1

您是否嘗試過不調用urlquote? – jpic 2012-03-02 10:00:49

+0

是的,但沒有urlquote,unicode錯誤將顯示 – Angelia 2012-03-02 10:40:25

+0

你應該替換「附件由u」附件,我認爲...也嘗試force_unicode而不是urlquote(從django.utils.encoding導入force_unicode) – jpic 2012-03-02 10:55:57

回答

2

我認爲它可能有一些做與Encoding Translated Strings

試試這個:

from django.utils.encoding import smart_str, smart_unicode 
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(filename) 
    return response 
+0

是的,它的工作原理,謝謝! – Angelia 2012-03-05 02:00:18

1

下面的代碼工作爲我解決你的問題。

from django.utils.encoding import escape_uri_path 

response = HttpResponse(attachment.file, content_type='text/plain',mimetype='application/octet-stream') 

response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(escape_uri_path(filename)) 
return response 
+1

你是說,「下面的代碼適用於我解決你的問題」?如果是這樣,你能解釋OP如何將它應用於他們的問題嗎? – sgress454 2015-10-10 16:39:38

0

由於bronze manKronel,我來的可接受的解決這個問題:

urls.py:

url(r'^customfilename/(?P<filename>.+)$', views.customfilename, name="customfilename"), 

views.py:

def customfilename(request, *args, filename=None, **kwds): 
    ... 
    response = HttpResponse(.....) 
    response['Content-Type'] = 'your content type' 
    return response 

your_template.html(鏈接到提供文件的視圖)

<a href="customfilename/{{ yourfancyfilename|urlencode }}.ext">link to your file</a> 

請注意,文件名並不一定是一個參數。但是,上面的代碼會讓你的函數知道它是什麼。如果您在同一個函數中處理多個不同的內容類型,這很有用。

相關問題