最近的一个项目在上传图片的时候速度非常慢,现有的上传方案是:图片发送到服务器,有服务器往oss里面写。但是实际的效果非常糟糕,7兆的文件需要传输大约40秒,这个用户体验就非常差。既然是基于oss的存储,那么可以完全不用经过服务器,直接上传到oss。
百度CDN加速阿里云OSS
之前也想过要给blog套一层cdn,不过通过cname方式介入的时候在he.net的dns解析那里遇到了问题,没有办法添加@的cname记录。直到前几天换了服务器发现dns解析依然停留在阿里云的时候发现应该可以试一下。于是重新开始了百度cdn的折腾,流程也比较简单,在 百度的后台设置a记录解析到服务器的原有ip地址。
百度云加速是百度旗下为网站提供一站式加速、安全防护和搜索引擎优化的产品。百度云加速正为数十万用户的近百万网站提供CDN、网络安全和SEO服务。每天处理十亿级的PV流量及数百亿TB的数据流量,并提供市场顶尖水平的稳定性和抗攻击能力。
阿里云 OSS批量设置Cache-Control
阿里云的服务器带宽一向都是小水管,为了加快加载速度把大量的图片都上传到了oss上。本地文件通过litespeed设置缓存,但是oss上的文件却没有一个统一的入口设置浏览器缓存。如果通过后台设置,需要每个文件都要去处理。而插件也没看到设置浏览器Cache-Control的地方。不过好在阿里云提供了一个命令行工具ossutil64(能简单解决的,就没必要去写代码啦~~) 。
阿里云oss 批量检测文件是否存在
虽然阿里云oss的sdk提供了检测文件是否存在,但是在批量处理的时候你就会发现检测一次需要联网一次,如果文件过多最后会提示你链接数超过限制,最终无法进行检测了。
下面是阿里云提供的示例代码:
# -*- coding: utf-8 -*-
import oss2
# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('', '')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '')
exist = bucket.object_exists('')
# 返回值为true表示文件存在,false表示文件不存在。
if exist:
print('object exist')
else:
print('object not eixst')
那么其实可以反过来想,直接拉文件目录落下来进行比较,列举文件的代码如下:
# -*- coding: utf-8 -*-
# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('api-key', 'api-secret')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'https://oss-cn-beijing.aliyuncs.com', 'bucket-name')
file_arrary = []
# 设置Delimiter参数为正斜线(/)。
for obj in oss2.ObjectIterator(bucket, delimiter='/'):
# 通过is_prefix方法判断obj是否为文件夹。s
if obj.is_prefix(): # 文件夹
#print('directory: ' + obj.key)
for obj2 in oss2.ObjectIterator(bucket, prefix='%s' % obj.key):
#print('file: ' + obj2.key)
file_arrary.append(obj2.key)
else: # 文件
file_arrary.append(obj.key)
如果要判断文件是否存在,只需要在数组中进行比较就可以了
file_arr = []
for file in file_arr:
if file in file_arrary :
print('esixts')
else:
print('not exists')