导航

  • 引子
  • 棘手的需求
  • 化繁为简
  • 实战案例
  • 结语
  • 参考

本文首发于智客工坊-《python批量上传文件到七牛云》,感谢您的阅读,预计阅读时长3min。

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。 —— 苏轼

引子

七牛云对象存储 Kodo 是七牛云提供的高可靠、强安全、低成本、可扩展的存储服务。您可通过控制台、API、SDK 等方式简单快速地接入七牛存储服务,实现海量数据的存储和管理。通过 Kodo 可以进行文件的上传、下载和管理。

我们通常将图片、音视频、javascript、css等静态资源上传到七牛云,利用cdn提高访问速度。

但是,遗憾的是,七牛云没有提供批量上传指定文件目录中所有文件的功能,而只能单个上传。

棘手的需求

我们有一个基于NextJs构建的web项目,每次发布都会在本地打包,发布的文件成百上千,且目录是多层结构。

通常我们是直接将打包后的文件拷贝到web服务器替换。坏就坏在,里面有个wasm类型的文件超过2.8M,首次加载超过10s,导致整个网站卡顿。

如何解决呢?

从nextjs官网查阅发现,支持为静态资源添加路径前缀并支持发布到CDN。

const isProd = process.env.NODE_ENV === 'production'

module.exports = {
// Use the CDN in production and localhost for development.
assetPrefix: isProd ? 'https://cdn.mydomain.com' : '',
}

静态资源上传到 CDN,这是存在目前存在的最大的问题,虽然在next.config.js中可以配置assetPrefix字段,但实际使用起来还是非常困难。

打包后的 js 和 css,引用路由均为/_next/static开头。

假设我们的CDN地址是 http://static.qq.com

<script src="http://static.qq.com/runtime/webpack-4b444dab214c6491079c.js"></script>

最后拼接后的地址是:

<script src="http://static.qq.com/_next/static/runtime/webpack-4b444dab214c6491079c.js"></script>

中间多出了/_next/static的路径,最后的结果是页面需要加载的资源和上传的资源路径不一致,就会各种 404。

无独有偶,也有博友遇到了类似的问题-《nextjs:如何将静态资源发布到 CDN》

化繁为简

复杂的事情简单化。

综合各方的信息,最终决定尝试将_next/static及其文件整体上传到七牛云。

在七牛云的存储目录如下:

根目录/_next/static/

这样代码上就不需要做改动。

唯一要做的就是实现批量上传文件到七牛云。

实战案例

废话不多说,我们现在就用代码来实现上面的需求吧!


# -*- coding: utf-8 -*-
# author: zhikecore
# https://developer.qiniu.com/kodo/1242/python#rs-stat import os;
from qiniu import Auth, put_file, etag
from qiniu import BucketManager # 全局变量
# 需要填写你的 Access Key 和 Secret Key
ACCESS_KEY='您申请的七牛云Access Key'
SECRET_KEY='您申请的七牛云Secret Key' #要上传的空间
BUCKET_NAME = '您申请的七牛云空间名称bucket' # 遍历文件
def scan_dir(path):
for root, dirs, files in os.walk(path):
for file in files:
filePath=os.path.join(root, file)
fileDir=os.path.dirname(filePath).replace('\\','/')
fileKey=fileDir.replace(path,'_next/static')+'/'+file
#print('fileDir:'+fileDir+',filePath:'+filePath+',fileKey:'+fileKey)
#delfileKey(fileKey)
#print("del fileKey:"+fileKey+",success!")
upload(filePath,fileKey)
print("upload fileKey:"+fileKey+",success!")
for dir in dirs:
dir=os.path.join(root, dir)
print(dir) def upload(filepath,fileKey):
#构建鉴权对象
q = Auth(ACCESS_KEY, SECRET_KEY)
#要上传的空间
bucket_name = BUCKET_NAME
#上传后保存的文件名
key=fileKey
#生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, key, 3600)
#要上传文件的本地路径
localfile = filepath
print('key:'+key,"localfile:"+localfile)
ret, info = put_file(token, key, localfile, version='v2')
print(info)
assert ret['key'] == key
assert ret['hash'] == etag(localfile) def delfileKey(fileKey):
#初始化Auth状态
q = Auth(ACCESS_KEY, SECRET_KEY)
#初始化BucketManager
bucket = BucketManager(q)
#你要测试的空间, 并且这个key在你空间中存在
bucket_name = BUCKET_NAME
key = fileKey
#删除bucket_name 中的文件 key
ret, info = bucket.delete(bucket_name, key)
print(info) # 如果该文件不是被import,则执行下面代码。
if __name__ == '__main__':
scan_dir('./_next/static')

代码中几乎每行都有注释,这里不再赘述。

至此,代码已经编写完成,我们保存为next_package_upload.py文件。

接下来,就是让代码run起来。


我们再次访问一下网站,查看wasm文件资源的加载速度。


很显然从10s+提升到10ms内,性能大幅提升。

这里需要注意的是,每次发版我会先删除旧的文件,再上传新的文件。delfileKey方法可以根据您的实际选择使用或者不用。

没有安装python环境的新手同学可以参考《Python安装和使用教程(windows)》

参考

python批量上传文件到七牛云的更多相关文章

  1. 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法

    一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...

  2. RN 上传文件到以及上传文件到七牛云(初步)

    本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...

  3. SpringSpringBoot上传文件到七牛云

    准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency> <groupId>com.qiniu</groupId> <artifa ...

  4. 使用Qiniu-JavaScript-SDK上传文件至七牛云存储

    一.Qiniu-JavaScript-SDK介绍 基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的图片进行丰富的数据处理操作. JS-SDK 兼容支持 H5 File A ...

  5. c++使用http协议上传文件到七牛云服务器

    使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...

  6. Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...

  7. laravel上传文件到七牛云存储

    背景 最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间. 要实现的功能很简单,选择本地 ...

  8. java(SSM)上传文件到七牛云(对象存储)

    项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...

  9. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

  10. 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)

    七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...

随机推荐

  1. 网络ping不通,试试这8招

    摘要:网络ping不通,该怎么办?本文教你8个大招,轻松找到问题根源. 本文分享自华为云社区<网络ping不通,该怎么办?>,作者:wljslmz. 如下图,PC(192.168.10.1 ...

  2. 当AI抄起了水表

    摘要:一套AI工作流,既减轻水表抄表工的负担,也保证了普通百姓用水数据的真实. 本文分享自华为云社区<行业案例:当AI抄起水表,一套工作流打通水务智能的"任督二脉">, ...

  3. Solon2 开发之IoC,四、注入依赖与初始化

    Solon 强调 有克制的注入 + 手动控制 结合的模式.好处是,代码用料少.启动快. Bean 的关键生命节点: 节点 说明 1. Constructor(构造方法) 不支持参数注入 2. @Inj ...

  4. Jenkins Pipeline SSH Publisher 环境变量、参数引用 要用双引号

    Jenkins Pipeline SSH Publisher 环境变量.参数引用 要用双引号 在 Pipeline 脚本中,如果要使用变量,就必须使用 " 双引号 pipeline { ag ...

  5. Nacos 1.2.1 集群搭建(三) Nginx 配置 集群

    配置 Nginx 可以把.conf 文件拉到本地,配置好再传上去 #gzip on; upstream cluster{ server 192.168.0.113:8848; server 192.1 ...

  6. Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置

    三台虚机的IP地址被DHCP重分了一下1.MySQL 配置 先建一个 nacos_config 数据库 将SQL执行(方法很多,选自己喜欢的就行) 2.修改 application.propertie ...

  7. Java ElasticSearch 操作

    pom 文件中添加: <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId ...

  8. 智慧城市大数据运营中心 IOC 之 Web GIS 地图应用

    前言 IOC(Intelligent Operations Center)--智慧城市智能运营中心就是智慧城市的大脑,是建立在各个智慧应用系统之上的系统.通过对政府各职能部门的业务信息共享与整合,聚焦 ...

  9. nginx安装 没有网络且缺少基础包的环境下

    一.安装 [root@oracle ~]# cd /etc/yum.repos.d/ [root@oracle yum.repos.d]# rm -rf * [root@oracle yum.repo ...

  10. freeswitch 新通话启动过程梳理

    概述 freeswitch是一款开源的VOIP软交换平台,功能强大. 在使用fs进行呼叫业务的过程中,我们最常见到的日志就是呼叫通道的启动信息,日志如下 2022-03-03 14:14:30.028 ...