Python的Django中将文件上传至七牛云存储的代码分享


Posted in Python onJune 03, 2016

最近在写的一个django小项目需要实现用户上传图片的功能,使用到了七牛云存储,特此记录下来。这里我使用的七牛python SDK 版本是7.0.3,函数使用上可能会与旧版有些不同。

原本文件上传需要先把文件上传到自己的业务服务器,再从业务服务器上传到云存储。现在七牛的表单上传可以直接把文件上传到七牛,不再需要业务服务器的中转,节省了流量成本,降低了业务服务器的压力。而且通过设置,还可以在文件上传完成后让客户端自动重定向到一个上传成功的结果页面。这里我就是使用了七牛的表单上传。

表单上传

用户上传图片的HTML表单代码如下。其中key用来指定图片保存在七牛中的文件名,token是上传凭证,即用来验证合法性和设置返回信息的。

upload.html

<form method="POST" action="http://upload.qiniu.com/" enctype="multipart/form-data">
<input name="key" type="hidden" value="">
<input name="token" type="hidden" value="">
<input name="file" type="file">
<input type="submit">
</form>

跳转到上面HTML页面的视图函数中的关键代码如下。其中upload_token函数用于生成表单里的token字段,upload_token函数中的7200代表上传凭证的有效期,returnUrl表示上传成功后的重定向地址,returnBody表示重定向时七牛返回的信息,它是一个base64编码后的json数据,需要解码获取json数据,当上传出错时错误信息直接在url中以明文的形式出现,并不会在返回的json数据里。通过设置mimeLimit还可以限制上传文件的类型。

views.py

import qiniu
import uuid
ACCESS_KEY = '七牛分配的公钥'
SECRET_KEY = '七牛分配的私钥'
BUCKET_NAME = '保存文件的仓库名'
key = str(uuid.uuid1()).replace('-', '') # 这里使用uuid作为保存在七牛里文件的名字。并去掉了uuid中的“-”
q = qiniu.Auth(ACCESS_KEY, SECRET_KEY)
token = q.upload_token(BUCKET_NAME, key, 7200, {'returnUrl':'http://127.0.0.1:8000/photos/uploadprocessor', 'returnBody': '{"name": $(fname), "key": $(key)}', 'mimeLimit':'image/jpeg;image/png'})
return render_to_response('photos/upload.html', {'token': token, 'key': key}, context_instance=RequestContext(request))
Python 相关文章推荐
python网络编程学习笔记(四):域名系统
Jun 09 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Django 路由控制的实现
Jul 17 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Python中Qslider控件实操详解
Feb 20 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 #Python
详解字典树Trie结构及其Python代码实现
Jun 03 #Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 #Python
Python中的descriptor描述器简明使用指南
Jun 02 #Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 #Python
深入理解Python变量与常量
Jun 02 #Python
Python中的Descriptor描述符学习教程
Jun 02 #Python
You might like
php 变量定义方法
2009/06/14 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
python创建进程fork用法
2015/06/04 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
基于Python的接口测试框架实例
2016/11/04 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
数据库面试要点基本概念
2013/10/31 面试题
25道Java面试题集合
2013/05/21 面试题
计划生育工作总结2015
2015/04/03 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android