Django之文件下载

Posted 一张红枫叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之文件下载相关的知识,希望对你有一定的参考价值。

到目前为止,我们的注意力都在html网页上,但是实际上,在网站上除了HTML外还有图片,文件,PDF等等。
首先来看下返回一张图片为例,读取本地磁盘上的一张图片并返回到网页上显示。
def test1(request):
    image_data=open(r\'d:/django_test2/code.JPG\',\'rb\').read()
    return HttpResponse(image_data,content_type=\'image/JPG\')
 
在网页上可以看到我们的代码截图显示在浏览器上

接下来看下如何生成文件,在网站上经常要下载后台的文件或者是显示后台文件的内容。

下面通过HttpResponse的方法可以直接将读取的内容显示在网页上

def test1(request):
    with open(r\'d:/django_test2/django.txt\') as f:
        c=f.read()
    return HttpResponse(c)

但是这种方法只适合小文件,如果遇到大的文件则会很耗内存。

Django中提供了StreamingHttpResponse可以以流的方式进行下载。代码如下。

from django.http import StreamingHttpResponse
def test1(request):
    def file_itertor(file_name,chunk_size=512):
        with open(file_name) as f:
            while True:
                c=f.read(chunk_size)
                if c:
                    yield c
                else:
                    break
   
file_name=r\'d:/django_test2/django.txt\'
   
download_file=\'django.txt\'
   
response=StreamingHttpResponse(file_itertor(file_name))
    response[\'Content-Type\'] = \'application/octet-stream\'
   
response[\'Content-Disposition\'] = \'attachment;filename="{0}"\'.format(download_file)
    return response

如果没有设置Content-Type和Content-Disposition,那么文件流会直接显示在浏览器上,如果要下载到硬盘上则必须设置Content-Type和Content-Disposition。其中download_file为下载的时候显示的文件名。

刷新网页的时候,会自动下载该文件

最后来看下PDF文档的生成。

首先要安装一个reportlab。pip install reportlab

生成代码如下:

def test1(request):
    response = HttpResponse(content_type=\'application/pdf\')
    response[\'Content-Disposition\'] = \'attachment; filename="django-pdf.pdf"\'
   
p = canvas.Canvas(response)
    p.drawString(50, 50, "Hello django.")
    p.showPage()
    p.save()
    return response

刷新在浏览器中自动下载生成的PDF文件

生成的pdf文件内容。

 

 

 


以上是关于Django之文件下载的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

面向面试编程代码片段之GC

Django REST框架--认证和权限

如何在 Django 中显式重置模板片段缓存?