方法一: 使用httpresonse
下面方法从url获取file_path, 打开文件,读取文件,然后通过httpresponse方法输出。
import os from django.http import httpresponse def file_download(request, file_path): # do something... with open(file_path) as f: c = f.read() return httpresponse(c)
然而该方法有个问题,如果文件是个二进制文件,httpresponse输出的将会是乱码。对于一些二进制文件(图片,pdf),我们更希望其直接作为附件下载。当文件下载到本机后,用户就可以用自己喜欢的程序(如adobe)打开阅读文件了。这时我们可以对上述方法做出如下改进, 给response设置content_type和content_disposition。
import os from django.http import httpresponse, http404 def media_file_download(request, file_path): with open(file_path, 'rb') as f: try: response = httpresponse(f) response['content_type'] = "application/octet-stream" response['content-disposition'] = 'attachment; filename=' os.path.basename(file_path) return response except exception: raise http404
httpresponse有个很大的弊端,其工作原理是先读取文件,载入内存,然后再输出。如果下载文件很大,该方法会占用很多内存。对于下载大文件,django更推荐streaminghttpresponse和fileresponse方法,这两个方法将下载文件分批(chunks)写入用户本地磁盘,先不将它们载入服务器内存。
方法二: 使用steaminghttpresonse
import os from django.http import httpresponse, http404, streaminghttpresponse def stream_http_download(request, file_path): try: response = streaminghttpresponse(open(file_path, 'rb')) response['content_type'] = "application/octet-stream" response['content-disposition'] = 'attachment; filename=' os.path.basename(file_path) return response except exception: raise http404
方法三: 使用fileresonse
fileresponse方法是steaminghttpresponse的子类,是小编我推荐的文件下载方法。如果我们给file_response_download加上@login_required装饰器,那么我们就可以实现用户需要先登录才能下载某些文件的功能了。
import os from django.http import httpresponse, http404, fileresponse def file_response_download1(request, file_path): try: response = fileresponse(open(file_path, 'rb')) response['content_type'] = "application/octet-stream" response['content-disposition'] = 'attachment; filename=' os.path.basename(file_path) return response except exception: raise http404
以上就是本文的全部内容,希望对大家的学习有所帮助,