【技术博客】Django中文件下载的实现

开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了。我们认为这样的经验是有必要记录下来的,因此就有了【技术博客】。

Django中文件下载的实现

1、背景

在VisualPytorch项目中,当时需要提供一个文件下载的功能。最初想到的方案主要有一下三种

  • 直接把网页前端的字符串写入文件中,在客户端完成。

这个方案经过查找资料发现不同浏览器的同源策略以及安全策略不尽相同,难以实现,放弃。

  • 在服务器上再开一个ftp服务器系统地提供文件服务。

这是最开始的思路,后来根据实际需求认为目前服务器性能本身就有限,加上目前项目对文件需求比较简单,不需要复杂的文件服务。

  • 直接在服务器固定目录下生成文件,打包后通过http流的形式传输

最终采用的实现方法,比较简单好实现。

2、Django后端中的文件打包与下载

关于文件打包,在实现时使用了zipfile这个python包

zipf = zipfile.ZipFile("project_VisualPytorch.zip", 'w',zipfile.ZIP_DEFLATED)

关于zipfile的使用详情请见https://docs.python.org/3/library/zipfile.html

服务器后台是通过构造Http的response对象向前端发送数据的,对于较大的文件传输来说,这里推荐使用Django框架中的StreamingHttpResponse或FileResponse构造响应对象。

StreamingHttpResponse采用流式传输文件,参数是一个迭代器,对文件进行分片传输,实现如下

response = StreamingHttpResponse(file_iterator("project_VisualPytorch.zip"))
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename="project_VisualPytorch.zip"'
return response

迭代器构造如下

def file_iterator(file_name, chunk_size=512):
    with open(file_name, 'rb') as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break

这里设置分片大小为512。

FileResponse是StreamingHttpResponse的子类,使用了缓存等技术,某些情况下优于其父类。

原文地址:https://www.cnblogs.com/1606-huluwa/p/10990956.html

时间: 2024-10-29 22:13:17

【技术博客】Django中文件下载的实现的相关文章

手把手教你建github技术博客by hexo

适合人群 喜欢写Blog的人 有一定的编程基础 爱折腾的人 熟练使用版本控制Git 了解使用Github 熟悉基本的MarkDown语法 环境准备 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装. 安装hexo 利用 npm 命令即可安装.(在任意位置点击鼠标右键,选择Git bash) npm install -g hexo 问题 * npm ERR! registry e

如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

    如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己就能找出规律和技巧.所以,要写出高质量的技术博客,首先要解决为什么要写的问题. 为什么要写 我一直很喜欢的一个学习方法是 Learning by teaching 一个课题,如果你能给不懂的人解释清楚,说明你对这个课题的理解足够深入.把一个课题展开来写,你可能会发现某些方面你还写不清楚,这往往说明你

程序猿的技术博客Android客户端--博客园篇

2015年尾了,闲了半年,也忙了半年 年尾了,趁着不忙的这段时间,好好梳理梳理 每天逛逛技术博客的习惯从大学一直延续到现在,博客园,csdn,iteye,51CTO,ITPUB之类的 浏览器里面一个个书签,每次打开又关上,一天天重复,一天天的了解着最新的技术资源 终于开始想着,开发一个Android的app来把这些资源整合起来,不仅能节约时间,还能趁机会好好检验下近一年来Android的技术 先上图,今天晚上才开始的 目前:暂时只有博客园首页的文章列表和文章详情的展示界面 主要涉及技术点: 1.

iOS大神技术博客

唐巧的技术博客 http://blog.devtang.com/atom.xml OneV's Den http://onevcat.com/atom.xml 破船之家 http://beyondvincent.com/atom.xml NSHipster http://nshipster.cn/feed.xml Limboy 无网不剩 http://feeds.feedburner.com/lzyy Lex iOS notes http://ios.lextang.com/rss 念茜的博客 

程序猿的技术博客Android客户端--CSDN篇

2016年了,新的一年,新的开始 技术博客Android客户端也在慢慢的完善着 先上图 主要新增: 1.CSDN博客文章列表和详情 2.侧滑新增系统设置 3.系统设置新增离线缓存,默认缓存50页数据 4.TextView中代码样式调整显示 主要涉及知识点: 1.本地数据缓存sqlite 2.本地缓存读取和清除系统缓存[应用缓存和内存占用和文件缓存以及数据库缓存] 待完成: 1.图片加载和禁用 2.文章评论列表 3.文章分享 4.文章本地收藏 本段代码对TextView中代码段的处理,摘选自网上一

开通技术博客之旅

记得孔子在论语中说过温故而知新,可以为师矣.为不为师我不知道. 我认为温故而知新有三解:一为“温故才知新”:温习已学的知识,并且由其中获得新的领悟:二为“温故及知新”:一方面要温习典章故事,另一方面又努力撷取新的知识.三为,温故,知新.随着自己阅历的丰富和理解能力的提高,回头再看以前看过的知识,总能从中体会到更多的东西.   合并这三种解法,也许更为完整:在能力范围以内,尽量广泛阅览典籍,反复思考其中的涵义,对已经听闻的知识,也要定期复习,期能有心得.有领悟:并且也要尽力吸收新知:如此则近可以开

创建GitHub技术博客全攻略

说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本文中假设用户名为 tiemaocsdn 1. 注册账号:地址: https://github.com/输入账号.邮箱.密码,然后点击注册按钮. 图1 第1步 2. 初始设置注册完成后,选择Free免费账号完成设置. 图2 第2步 2.1 验证邮箱请打开你的邮箱,查看发送给你的确认邮件,你需要验证邮箱后,后面生成的个人主页才会被接受和发布. 3. 创建页面仓库地址:

技术博客与技术日记

最近开始写技术日记了:posebear1990.github.io 写技术日志的想法是来自于 @joyeecheung 妹子的日志 从技术博客到技术日记 ,虽然和她年龄相仿,但是能力见识真的是差了好几个量级.很快就觉得:前路已经铺好,我甚至都不用想着超越她,只管去跟随这样优秀者就好了.对于我来说技术日记的好处也是不少: 最痛心疾首的其实是博客园自带的编辑器,实在太难用了,虽然可以使用Live Writer,但是还是感觉太重了,有段时间看到类似word的界面就联想到了缓慢的启动速度,顿时写点东西的

从OneNote走出,技术博客养成记

2010年9月北上求学,在一所普通本科院校学习计算机专业,年少轻狂未能领悟计算机技术的本质渐生弃学之意. 2013年9月南下参军,在一个电抗部队从事通信指控专业,填补了扛枪演练的男儿情怀却又无法抵制对自由的向往. 2015年9月份,从部队退役至地方,而后开始选择自己之后的职业方向.逐渐适应社会的生存法则,渐入式确定了工程师的角色. 2016年,正式入行软件工程师的职业道路.自从入行起,关于技术的学习,一直是将新的技能或者技术观点碎片化阅读学习,并保存到OneNote.关于技术的沉淀,并未做到系统