七牛云存储Python SDK使用教程 - 上传策略详解
- 推荐 1 推荐
- 收藏 2 收藏,2.7k 浏览
本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作。
前言
我们在上面的两节中了解到,客户端上传文件时,需要从业务服务器申请一个上传凭证(Upload Token),而这个上传凭证是业务服务器根据上传策略(PutPolicy)来生成的,而这个生成过程中还必须使用到AccessKey和SecretKey。
我们从上面的简单示意图中可以看到:
- 上传客户端向业务服务器申请一个上传凭证(Upload Token)
- 业务服务器返回一个上传凭证给上传客户端
- 上传客户端构建上传请求,上传文件到七牛云存储服务器
- 七牛云存储服务器返回客户端文件上传的结果。
当然了,在我们前面的例子以及后面的例子中,上传客户端和业务服务器是一个,但是从业务模型来讲,第1步和第2步还是分开的(比如在网页端上传或者移动APP端上传中)。
上传策略
我们要研究七牛的上传策略,必须要了解它的所有的支持的参数(一共也不多)。文档:戳这里。
很多人可能第一眼看上去,感觉参数好多啊,头就大了,其实不然,对付多的东西,最好的办法就是分组,把参数按照功能不同进行分组。比如对于上传策略我们可以分为以下几组:
基本参数
基本参数包括文件上传后存储的空间,文件的上传模式(是否支持覆盖上传),上传凭证的过期时刻,业务服务器指定上传文件的名字等。
| 参数名 | 说明 |
|---|---|
| scope | 上传的空间bucket,或者是bucket:key(用于支持文件覆盖上传)。 |
| deadline | 上传凭证的失效时刻的时间戳,一般sdk里面会用参数expires来设置,就是deadline = now()+expires其中单位都是秒。 |
| insertOnly | 默认为0,配合scope=bucket:key可以支持覆盖上传,如果为1,则表示强制上传的语义是新建,遇到文件存在则返回file exists错误。 |
| saveKey | 业务服务器可以利用这个参数来指定上传文件在七牛云存储所保存的名字(仅在上传客户端没有指定请求参数key的情况下生效)。 |
| endUser | 可以用来标注文件上传端设备的信息,比如手机类型,系统类型什么的。 |
自定义上传回复
默认情况下,七牛云存储返回给上传客户端的信息只包括了文件的hash和key,就像我们前面看到过的那样:
{"hash":"FoaI_ZzokcGpZA48PVJPFNJvLoNc","key":"FoaI_ZzokcGpZA48PVJPFNJvLoNc"}
那么有没有办法,扩充这个单薄的返回信息呢?
答案当然是:有!
| 参数名 | 说明 |
|---|---|
| returnBody | 可以用来自定义上传的回复内容,支持魔法变量和自定义变量(又称为扩展变量),关于变量详见文档:戳这里 |
上传完成重定向
上传客户端在文件上传完成之后,从七牛云存储服务器那里获取上传结果的回复。这个过程中,没有再涉及到业务服务器,但是如果我希望文件上传之后,七牛服务器能不能告诉业务服务器一点信息呢?当然是可以的,其中一种方法就是页面重定向,页面重定向当然得知道重定向的地址(returnUrl)了,另外重定向到新的地址携带的参数内容可以通过returnBody来设置。
在文件上传完成之后,七牛返回给上传端303的状态码,然后上传端可以重定向到returnUrl所指定的地址,比如重定向到http://.../service/return_upload_service?upload_ret=eyJmbmFtZSI6InVwbG9hZF9kcmFmdC5wbmciLCJldGFnIjoiRnNOM0g4eS15NGxzcV9jZ2p0NEQ3a2E5cjVmUSIsImtleSI6IkZzTjNIOHkteTRsc3FfY2dqdDREN2thOXI1ZlEiLCJleFBhcmFtMSI6ImhlbGxvIiwiZXhQYXJhbTIiOiJxaW5pdSIsImV4UGFyYW0zIjoicWluaXUifQ==这样的地址,而这里的returnUrl设置为http://.../service/return_upload_service,而重定向地址携带的参数upload_ret的内容则是由returnBody来指定的,看上去upload_ret好像是base64编码吧,对的!是URL安全的Base64编码(在七牛的应用中,所提到的base64编码一般都是URL安全的Base64编码)。对upload_ret做一下解码就能得到真正的内容。
| 参数名 | 说明 |
|---|---|
| returnUrl | 上传端重定向的地址。 |
| returnBody | 上传端重定向的时候,用来组织所携带的URL参数upload_ret的内容。 |
上传完成回调
我们上面看到了一种文件上传完成之后七牛服务器和业务服务器交互的一种方式,是通过上传端的重定向来实现的。当然这种方式有适用的场景。但是大多数情况下,我们都会用另外一种方式来进行七牛服务器和业务服务器的交互,这种方式叫做回调(Callback)。回调是在文件上传到七牛之后发生的,七牛会根据上传策略里面的参数callbackUrl指定的地址来发送一个POST请求,请求的内容则是由上传策略里面的callbackBody来指定的,另外还有一个callbackHost可以用来指定某个回调的主机地址,比如ip地址,另外callbackBody的内容组织格式是由callbackBodyType来决定的。七牛服务器会根据callbackBodyType来设置发送给业务服务器的POST请求的Content-Type,目前支持application/x-www-form-urlencoded和application/json这两种格式。
| 参数名 | 说明 |
|---|---|
| callbackUrl | 七牛服务器回调业务服务器的地址,必须是公网可以访问的地址,能够接受POST请求。 |
| callbackBody | 定义七牛服务器回调业务服务器时,POST请求的Body内容。 |
| callbackBodyType | 指定callbackBody的内容格式,支持url和json两种格式。 |
| callbackHost | 指定具体的回调主机地址,可以设置为ip地址以节约DNS解析时间。 |
上传完触发持久化
我们知道七牛支持很多图片和音视频处理的接口和指令,假设我希望从PC上传一个图片或者视频,然后上传完成立马触发七牛的文件处理指令将我上传的文件处理为支持不同平台的文件,那么我就可以使用下面的三个参数。
| 参数 | 说明 |
|---|---|
| persistentOps | 数据处理指令集,之所以叫做指令集就是支持多个对原文件的处理指令,每个指令用;连接起来。这里的指令比如imageView2,avthumb,vframe等等。 |
| persistentNotifyUrl | 这个地址是用来接收七牛服务器数据处理结果的,其接收到的数据内容和利用接口prefop文档查询到的内容是一模一样的格式。 |
| persistentPipeline | 指定数据处理所使用的队列名称,这个队列可以在七牛的后台管理系统中创建。如果不指定,表示使用公用队列,数据处理效率上可能低于指定的私有处理队列。 |
文件上传限制
我们可以在上传策略里面指定文件上传的最大大小和允许的文件类型。
| 参数 | 说明 |
|---|---|
| fsizeLimit | 文件上传的最大大小,单位为字节(Byte)。 |
| mimeLimit | 文件上传的类型,可以通过允许的语义(image/jpeg;image/png,表示只允许jpeg和png格式图片)或者不允许的语义(!application/json;text/plain,表示不允许json和纯文本文件)来指定。 |
上传策略和SDK
在最新版本的Python的SDK中(v7.0),上传策略的参数定义在auth.py里面,如下:
_policy_fields = set([
'callbackUrl',
'callbackBody',
'callbackHost',
'returnUrl',
'returnBody',
'endUser',
'saveKey',
'insertOnly',
'detectMime',
'mimeLimit',
'fsizeLimit',
'persistentOps',
'persistentNotifyUrl',
'persistentPipeline',
])
我们看一个小例子来演示,如何使用policy。
#有key上传,限定上传文件的大小和mimeType
def upload_with_key_and_fsizelimit_mimelimt():
bucket = "if-pbl"
key = "qiniu.jpg"
filePath = "/Users/jemy/Documents/qiniu.jpg"
auth = qiniu.Auth(accessKey, secretKey)
policy = {
"fsizeLimit": 1000,
"mimeLimit": "image/png"
}
upToken = auth.upload_token(bucket, key=key, policy=policy)
retData, respInfo = qiniu.put_file(upToken, key, filePath, progress_handler=progress)
parseRet(retData, respInfo)
这个例子中,我们使用了policy的两个参数fsizeLimit和mimeLimit,表示我们只允许上传大小不大于1000字节的类型为png的图片。
更多的关于policy的其他参数的例子我们将在后面的章节中给出。用法相似,先体会一下。
小结
从上面介绍的内容我们大致可以得出以下的一些结论:
- 上传策略决定了文件存储的空间
- 上传策略可以设定生成的上传凭证的有效期
- 上传策略支持文件同名覆盖上传
- 上传策略里面可以指定文件上传后上传端的重定向操作
- 上传策略里面可以指定文件上传后七牛服务器和业务服务器的交互操作
- 上传策略里面可以指定文件上传后,七牛服务器对其进行的一组数据处理操作
七牛云存储Python SDK使用教程 - 上传策略详解的更多相关文章
- 七牛云存储 qiniu 域名 回收 文件上传 备份 下载 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 使用Python3.7+Tornado5.1配合七牛云存储api来异步切分上传文件
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_123 之前写了几篇关于FastDfs分布式存储的文章:python3.7.3操作FastDfs来进行文件操作,其实市面上关于云存储 ...
- Struts2+Uploadify文件上传使用详解
Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...
- 初试“七牛云”--零基础运用七牛云配合UEditor实现图片的上传和浏览(.NET篇)
(注册和建立存储空间就不介绍了,网上一把一把的资料,自己试着点点也能明白) 作为一个成熟的菜鸟,如果遇到一个新问题,第一步当然是先百度一下... 看了N个关于七牛云的使用的帖子,表示还是蒙圈的,看懂了 ...
- 如何利用”七牛云”在UEditor实现图片的上传和浏览
在学习之前,我参考了朋友些的一篇关于这个功能实现的文章,非常不错.大家可以参考:http://www.cnblogs.com/John-Marnoon/p/5818528.html#3501846 里 ...
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
- 金山云 KS3 Python SDK 多线程并发上传文件;下载断点续传 参考脚本
并发上传 基于py自带模块 concurrent.futures import ThreadPoolExecutor #!/usr/bin/env python3 # -*- coding:utf-8 ...
- 【GIT】Github上传本地代码详解
本教程结合Github服务端和客户端完成本地代码上传至Github,下面进行详细讲解: 1.创建Github账号,这一个步骤应该不用太多解释,直接上官网进行注册登录即可https://github.c ...
- ASP.Net大文件上传组件详解
首先右键单击网站根目录,在弹出的快捷菜单中,选择"添加引用"菜单项,弹出"添加引用",切换到"浏览"找到组件的Dll文件"Best ...
随机推荐
- 保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()
当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候. 注意上面 ...
- 0911 Socket网络编程
1.实现ftp上传.下载功能 1.1 循环接收数据直到接收完毕 server端接收client发送的命令(比如说ifconfig),然后server端将命令执行结果反馈给客户端,这时候有个问题,ser ...
- 【LeetCode OJ】Word Ladder II
Problem Link: http://oj.leetcode.com/problems/word-ladder-ii/ Basically, this problem is same to Wor ...
- Bad Hair Day_单调栈
Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow ...
- ZOJ2006 (最小表示法)
var s:ansistring; cas:longint; function minp(st,len:longint):longint; var p1,p2,k,tmp:longint; begin ...
- 重学STM32---(八)----SDIO
1. SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC).SD存储卡.SDIO卡和CE-ATA设备间提供了操作接口.(SDIO没有SPI兼容的通信模式 ) 1.1.什么是 ...
- 深入分析Php处理浮点数的问题
下文来为各位介绍Php处理浮点数的问题了,如果各位在使用过程中碰到这些问题我们可以一起来看看,希望文章对各位有帮助 公司要对产品价格做调整,因为做的外贸商城,所以价格要和国际接轨.比如国外的价格展示方 ...
- JS中offsetLeft,Left,clientLeft的区别(纯转贴)
假设 obj 为某个 HTML 控件. obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置,整型,单位像素. obj.offsetLeft ...
- Generic Netlink详解
netlink socket是一种用于用户态进程和内核态进程之间的通信机制.它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯连接. Netl ...
- JS控制文本框textarea输入字数限制
<html> <head> <title>JS限制Textarea文本域字符个数</title> <meta http-equiv="C ...