使用Python调用又拍云表单API 上传文件

又拍云的签名计算方式,可以参考官网文档

本文主要介绍又拍云的表单上传,通过又拍云的表单 API 可以直接把本地文件上传到又拍云存储而不需要经过自己的服务器

代码

#!/usr/bin/python
# -*- coding:utf-8 -*-
import hashlib
import base64
import json
import hashlib
import datetime
import requests
import time
import json

DEFAULT_CHUNKSIZE = 8192

bucket = '' #空间名
secret = '' #表单密钥,后台找到对应服务---高级功能开启表单后复制
expiration = int(time.time())+8000 # 签名过期时间
uploadfile = '/Users/wenjun/Downloads/test.mp4' #上传文件的路径
save_key = '/{year}/{mon}/{day}/upload_{random32}{.suffix}' #在UPYUN空间的保存路径
content_type = "video/mp4" # 文件类型

# md5计算
def make_content_md5(value, chunksize=DEFAULT_CHUNKSIZE):
    if hasattr(value, 'fileno'):
        md5 = hashlib.md5()
        for chunk in iter(lambda: value.read(chunksize), b''):
            md5.update(chunk)
        value.seek(0)
        return md5.hexdigest()
    elif isinstance(value, bytes) or (not PY3 and
                                      isinstance(value, builtin_str)):
        return hashlib.md5(value).hexdigest()
    else:
        raise UpYunClientException('object type error')

# 计算 policy
def make_policy(data):
    policy = json.dumps(data)
    return base64.b64encode(policy)

#上传
def upload():
    #上传参数,此处只传了几个必须的参数,其他参考可以参考官网文档表单API 上传参数部分的表中内容
    data = {'bucket': bucket,
            'expiration': expiration,
            'save-key': save_key,
            'content-type':content_type,
            'b64encoded': 'on',
           }
    policy = make_policy(data)
    signature = make_content_md5(policy + '&' + secret) # 计算签名
    print "---------计算签名完成,准备上传参数----------------"
    with open(uploadfile, 'rb') as value:
        value = base64.b64encode(value.read());
        postdata = {'policy': policy,
                    'signature': signature,
                    'file': value,
                    }
        print "---------准备请求参数完成,开始上传----------------"     
        r = requests.post("http://v0.api.upyun.com/file201503", files=postdata)
        if r.status_code == 200:
            print "---------文件上传成功,正在模拟是否可以访问----------------"
            # 此处需要将 text 的内容转换成 json 格式,然后取出其中的 url
            uploadinfo = json.loads(r.text)
            headurl = "http://"+bucket+".b0.upaiyun.com"+uploadinfo["url"]
            print "---------模拟访问完成,以下是访问结果----------------"
            r = requests.head(headurl)
            if r.status_code == 200:
                print "---------文件可以访问,访问地址是:"
                print headurl
            elif requests == 404:
                print "---------文件访问404,由于 CDN 缓存问题,您可以稍后用浏览器尝试访问,您的地址:"
                print headurl

        else :
            print "文件上传失败" 

if __name__ == "__main__":
    upload()

运行结果