簡體   English   中英

Django下載文件:UnicodeDecodeError

[英]Django downloading file:UnicodeDecodeError

我使用Django 1.11下載文件。這是我的功能。

def file_downloading(request, filename):
    path = settings.MEDIA_ROOT+'/'
    the_file_name = path+filename
    f_name = filename.split('/')[len(filename.split('/'))-1]
    wrapper = FileWrapper(open(the_file_name, "r"))
    content_type = mimetypes.guess_type(the_file_name)[0]
    response = HttpResponse(wrapper, content_type=content_type)
    response['Content-Length'] = os.path.getsize(path) 
    response['Content-Disposition'] = 'attachment; filename=%s f_name 
    return response`

但是當我嘗試下載.pdf文件時出現了UnicodeDecodeError 。實際上它僅在文件.txt時有效。 當我將包裝器更改為open("file_name","rb") ,可以下載文件,但是無法打開文件。如何處理此問題?

Django的HttpResponse類最適合基於文本的響應(html頁面,txt文件等)。 類構造函數文檔說明:

內容應為迭代器或字符串。 如果是迭代器,則應返回字符串,並將這些字符串連接在一起以形成響應的內容。 如果它不是迭代器或字符串,則在訪問時將轉換為字符串。

content轉換為字符串時,可能會引發UnicodeDecodeError。 如果要返回PDF文件,則文件內容為二進制數據,因此不打算將其轉換為字符串。

您可以改用FileResponse類。 它繼承自StreamingHttpResponse,因此具有與HttpResponse不同的APi,但返回二進制文件(如PDF)可能會更好。

嘗試將編碼添加到要打開的文件中,如下所示:

open(the_file_name, 'r', encoding='utf-8')

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM