#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created on 2018-09-01 19:02
import requests
from qiniu import Auth, put_file, etag
import qiniu.config
import config
# 网站上的access_key和secret_key,保密
q = Auth(config.ACCESS_KEY, config.SECRET_KEY)
# 在七牛云网站上创建的存储空间名称
bucket_name = config.BUCKET_NAME
bucket = qiniu.BucketManager(q)
def upload_file():
"""
上传文件
"""
# 上传到云空间时的文件名称
# 该名称不能重复,如果重复了话,后面的不会覆盖前面的,也是直接消失了,但还是会返回200
# 可以上传文件
# 之前一直疑惑,为什么上传后没有返回文件的访问链接,看了下七牛云的外链后发现格式组成是
# url + filename
# url可以自己绑定域名,如果没有,那么就是默认的"http://ped06svnz.bkt.clouddn.com/"
# 例如上传的是aa.txt文件,那么访问就是 http://ped06svnz.bkt.clouddn.com/aa.txt方式
file_name = 'bi.jpg'
# 本地路径
localfile = '../../image/bi.jpg'
# 生成上传的token,可以指定过期时间
token = q.upload_token(bucket_name, file_name, 3600)
print('token =', token)
# 上传文件
ret, info = put_file(token, file_name, localfile)
print('info =', info)
print('ret =', ret)
def state():
"""
获取文件信息
"""
file_name = 'logo.jpg'
ret, info = bucket.stat(bucket_name, file_name)
print(ret)
print(info)
def filelist():
"""
获取文件列表
"""
# 文件名的前缀,默认为None,即全部
prefix = None
# 文件数量限制
limit = 2
# 指定目录分隔符
delimiter = None
# 列举标识符
# 没懂这两个什么意思
marker = None
# info是ResponseInfo对象
# ret是一个dict,里面的每项数据主要包括:
# {'key': 'aa.txt', 'hash': 'FkX3SBTMZBMQwzjoflXoVYNRqzTf', 'fsize': 2895,
# 'mimeType': 'text/plain', 'putTime': 15358025593369914, 'type': 0, 'status': 0}
ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
class FileItem(object):
def __init__(self, item):
# 文件名
self.key = item['key']
self.hash = item['hash']
# 文件大小
self.fsize = item['fsize']
self.mimeType = item['mimeType']
self.putTime = item['putTime']
self.type = item['type']
self.status = item['status']
def __str__(self):
return self.key
__repr__ = __str__
items = ret['items']
fileitems = []
for item in items:
fileitems.append(FileItem(item))
print(fileitems)
def download_file():
"""
私有空间下载
"""
filename = 'logo.jpg'
# 下载的话,也是需要知道文件名
base_url = '{0}/{1}'.format(config.BUCKET_DOMAIN, filename)
private_url = q.private_download_url(base_url, 3600)
# 直接使用base_url也是可行的
# private_url = base_url
print('private_url =', private_url)
r = requests.get(private_url)
with open(filename, 'wb') as fp:
fp.write(r.content)
def fetch_file():
"""
从网络抓取资源到云存储中
"""
# 网络资源的url
file_url = 'http://img.qikula.com/file/image/pic/2a1514549676n434241896c27.jpg'
# 截取文件名称
file_name = file_url.split('/')[-1]
# 上传
ret, info = bucket.fetch(file_url, bucket_name, file_name)
print(ret)
print(info)
def move_file():
"""
移动文件\重命名文件
如果传入的两个bucket_name是同一个名字,那么就相当于重命名了
你可以在云存储上创建多个bucket,然后将文件从一个移动到另一个
"""
bucket_name2 = config.BUCKET_NAME
filename = 'logo.jpg'
filename2 = 'logo2.jpg'
# 前面两个参数是src
# 后面是dest
ret, info = bucket.move(bucket_name, filename, bucket_name2, filename2)
# copy函数,传参一样,复制一个文件
print(ret)
print(info)
def delete_file():
"""
删除文件
如果文件不存在,则会返回 status_code:612, text_body:{"error":"no such file or directory"}
"""
filename = 'logo2.jpg'
ret, info = bucket.delete(bucket_name, filename)
print(ret)
print(info)
def update_deleted_days():
"""
更新文件被删除的时间
"""
filename = 'bi.jpg'
days = '1'
# 更新后,在网站上没有看到特殊标识
ret, info = bucket.delete_after_days(bucket_name, filename, days)
print(ret)
print(info)
# 批量操作
def batch():
"""
七牛提供的批量操作
"""
# 1.重命名
# 如果文件不存在,返回612(key)
# 如果文件已经存在,返回298(value)
keys = {'logo1.jpg': 'logo.jpg', 'aa.txt': 'bb.txt'}
ops = qiniu.build_batch_rename(bucket_name, keys)
ret, info = bucket.batch(ops) # ret的值为None info是ResponseInfo对象
# 2.批量查询
keys = ['logo.jpg', 'bb.txt', 'dd.png']
ops = qiniu.build_batch_stat(bucket_name, keys)
# 返回的info数据中,包含了下列值
# {"code":200,"data":{"fsize":2895,"hash":"FkX3SBTMZBMQwzjoflXoVYNRqzTf","md5":"noJ5jsvEamFj2xQ3+YxyFg==",
# "mimeType":"text/plain","putTime":15358109983825052,"type":0}}
ret, info = bucket.batch(ops)
# 3.批量移动
# force的意思是,如果target_bucket中有同名的文件,是否强制覆盖
# qiniu.build_batch_move(source_bucket,keys,target_bucket,force=True)
# 4.批量删除
qiniu.build_batch_delete(bucket_name, keys)
# 5.批量复制
# force的意思是,如果target_bucket中有同名的文件,是否强制覆盖
# qiniu.build_batch_copy(source_bucket,keys,target_bucket,force=True)
pass
if __name__ == '__main__':
# upload_file()
# state()
filelist()
# download_file()
# fetch_file()
# move_file()
# delete_file()
# update_deleted_days()
# batch()
pass
ResponseInfo类的主要数据:
class ResponseInfo(object):
"""七牛HTTP请求返回信息类
该类主要是用于获取和解析对七牛发起各种请求后的响应包的header和body。
Attributes:
status_code: 整数变量,响应状态码
text_body: 字符串变量,响应的body
req_id: 字符串变量,七牛HTTP扩展字段,参考 http://developer.qiniu.com/docs/v6/api/reference/extended-headers.html
x_log: 字符串变量,七牛HTTP扩展字段,参考 http://developer.qiniu.com/docs/v6/api/reference/extended-headers.html
error: 字符串变量,响应的错误内容
"""
参考
https://developer.qiniu.com/kodo/sdk/1242/python
https://developer.qiniu.com/dora