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正则表达式之作业计算器
Mar 18 Python
Python实现简易Web爬虫详解
Jan 03 Python
python中验证码连通域分割的方法详解
Jun 04 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
python psutil监控进程实例
Dec 17 Python
python实现人像动漫化的示例代码
May 17 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
python logging模块的使用
Sep 07 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
python基础入门之普通操作与函数(三)
Jun 13 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面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
Python中的高级数据结构详解
2015/03/27 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
appium+python adb常用命令分享
2020/03/06 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
幼儿教师年度个人总结
2015/02/05 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
Python中Cookies导出某站用户数据的方法
2021/05/17 Python