使用Flask 下載的文件使用中文文件名

使用Flask 編寫建立網(wǎng)站,在下載文件時如果把文件名設(shè)置為中文時,在下載時會報錯。具體代碼如下:

    def get(self,*args,**kw):
        fp=io.BytesIO()
        self.do_get(fp,*args,**kw)
        fp.seek(0)
        return send_file(fp,mimetype=self.mimetype,
            as_attachment=True, attachment_filename=filename)

如果attachment_filename 為英文時,程序運行正常。如為中文時,將直接報錯。在網(wǎng)上找解決方案,會發(fā)現(xiàn)網(wǎng)上眾說紛紜,能解決問題的沒有。

后來,無意中發(fā)現(xiàn)了確處理下載文件時中文文件名亂碼的問題(Content-Disposition),這篇文章徹底解決了這個問題。

其核心方法是應(yīng)該這樣設(shè)置 Content-Disposition:

Content-Disposition: attachment; filename="$encoded_fname" filename*=utf-8''$encoded_fname

其中,$encoded_fname指的是將 UTF-8 編碼的原始文件名按照 RFC 3986 進行百分號 urlencode 后得到的( PHP 中使用 rawurlencode()
函數(shù))。

根據(jù)上述方法,可以把上面函數(shù)修改如下:

    from urllib.parse import quote
    def get(self,*args,**kw):
        fp=io.BytesIO()
        self.do_get(fp,*args,**kw)
        fp.seek(0)
        filename=quote(self.filename) # 對文件名進行轉(zhuǎn)碼
        rv=send_file(fp,mimetype=self.mimetype,
            as_attachment=True, attachment_filename=filename)
        if filename!=self.filename: # 支持中文名稱
            rv.headers['Content-Disposition']+=\
              "; filename*=utf-8''%s"%(filename)
        return rv

經(jīng)過上面的修改,再運行程序。當文件名為中文的時候就可以正常下載了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容