美文网首页
django文件的下载

django文件的下载

作者: 赖三石 | 来源:发表于2017-11-05 13:41 被阅读0次

django提供文件下载时,若果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入Response对象中:

def simple_file_download(request):
    # do something...
    content = open("simplefile", "rb").read()
    return HttpResponse(content)



如果文件非常大时,最简单的办法就是使用静态文件服务器,比如Apache或者Nginx服务器来处理下载。不过有时候,我们需要对用户的权限做一下限定,或者不想向用户暴露文件的真实地址,或者这个大内容是临时生成的(比如临时将多个文件合并而成的),这时就不能使用静态文件服务器了。

templates/index.html

<div class="row">  
      <div class="col-md-8 col-md-offset-2">  
          <br>  
          <P>第一种方法,直接把链接地址指向要下载的静态文件,在页面中点击该链接,可以直接打开该文件,在链接上点击右键,选择“另存为”可以保存该文件到本地硬盘。  
             此方法只能实现静态文件的下载,不能实现动态文件的下载。</P>  
          <a href="{% url 'media' 'uploads/11.png' %}">11.png</a>  
          <br>  
          <br>  
          <p>第二种方法,将链接指向相应的view函数,在view函数中实现下载功能,可以实现静态和动态文件的下载。</p>  
          <a href="{% url 'course:download_file' %}">11.png</a>  
          <br>  
          <br>  
          <br>  
          <p>第三种方法,与第二种方法类似,利用按钮的响应函数实现文件下载功能。</p>  
          <label> 11.png</label><button onclick="window.location.href='{% url 'course:download_file' %}'">Download</button>  
      </div>  
  </div>  

views.py

def download_file(request):  
    # do something  
  
    the_file_name='xxx.png'             #显示在弹出对话框中的默认的下载文件名      
    filename='media/uploads/xxx.png'    #要下载的文件路径  
    response=StreamingHttpResponse(readFile(filename))  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="{0}"'.format(the_file_name)  
    return response  
  
def readFile(filename,chunk_size=512):  
    with open(filename,'rb') as f:  
        while True:  
            c=f.read(chunk_size)  
            if c:  
                yield c  
            else:  
                break  



python也提供一个文件包装器,将类文件对象包装成一个迭代器:(未验证)

class FileWrapper:
    """Wrapper to convert file-like objects to iterables"""
    def __init__(self, filelike, blksize=8192):
        self.filelike = filelike
        self.blksize = blksize
        if hasattr(filelike,'close'):
            self.close = filelike.close
    def __getitem__(self,key):
        data = self.filelike.read(self.blksize)
        if data:
            return data
        raise IndexError
    def __iter__(self):
        return self
    def next(self):
        data = self.filelike.read(self.blksize)
        if data:
            return data
        raise StopIteration

使用时views.py的写法

from django.core.servers.basehttp import FileWrapper
from django.http import HttpResponse
import os
def file_download(request,filename):
    wrapper = FileWrapper(file('filepath'))
    response = HttpResponse(wrapper, content_type='application/octet-stream')
    response['Content-Length'] = os.path.getsize(path) ??????
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response

相关文章

  • django文件的下载

    django提供文件下载时,若果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入Respons...

  • Django 实现文件下载

    上篇有【文件上传】,算是完成了一个比较完整的项目。 1.下载页面 2.下载页面代码 4.URL配置 3.下载页面前端代码

  • Django下载文件

    继上文的上传后,终于到了下载模块,因为只是简单实现,所以就不存在那么多复杂的流程了,也没有自己定义模板什么的,之前...

  • Django下载pdf文件

    导出pdf的需求,可以说不难实现,但根据项目要求,页面上存在js渲染的表格,直接用wkhtmltopdf没办法生成...

  • MocOs:Django(搭建和模型创建)

    打开终端创建一个虚拟环境 下载django环境 配置django里的settings信息 配置静态文件打开/dem...

  • Django的一些基本命令

    Django的基本命令:Windows里下载好Django源码后在cmd里切入文件夹中,然后执行python se...

  • Django_跨域解决方案

    Django 版本:2.0.2 1.下载中间件: 推荐通过pycharm下载: 或者通过: 2.增加配置文件

  • Django实现文件下载-FileResponse

    最近在做公司的一个版本发布的平台,要求把版本更新的文件链接都存放到一个txt文件中以便于下载下来,平台是采用pyt...

  • python|Django 实现文件的下载

  • Django实现文件的下载功能

    前言: 最近工作中需要使用django实现文件的下载功能。自己通过file.read方式实现后,在测试的过程中,发...

网友评论

      本文标题:django文件的下载

      本文链接:https://www.haomeiwen.com/subject/pjwcmxtx.html