首页 > 编程语言 >python批量上传文件到七牛云

python批量上传文件到七牛云

时间:2024-01-25 22:24:47浏览次数:40  
标签:文件 牛云 python next fileKey key 上传

导航

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

本文首发于智客工坊-《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,next,fileKey,key,上传
From: https://www.cnblogs.com/lucky_hu/p/17988315

相关文章

  • Python并发编程之锁
    锁【一】同步原语操作系统—同步原语-CSDN博客实现互斥锁的并发程序设计-皮特森算法【Peterson算法-维基百科】​ 同步原语是一组用于协调多个执行线程或进程之间操作顺序和共享资源访问的基本机制。这些机制的目的是确保多个执行单元能够按照某种协调方式执行,以避免并发......
  • python多级菜单纯循环与分支
    python_多级菜单_纯循环与分支源代码:#!/usr/bin/python3__author__='beimenchuixue'__blog__='http://www.cnblogs.com/2bjiujiu/'defmenu(message):print('按q返回上一层')print('按e退出')ec='q'......
  • [Python列表推导式使用举例]
    [Python列表推导式使用举例]"""列表推导式功能说明:列表推导式可以利用range区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。语法:[表达式for迭代变量in可迭代对象[if条件表达式]]"""list=[i+1foriinrange(10)]print(list)"""[1......
  • Python循环三级菜单
    Python循环三级菜单选择城市》选择区》选择区内的公司等三级菜单循环#coding=utf-8#Version:python3.6#Name:shiweidata={'北京':{'海淀':{'五道口':{'soho':{},'网易':{},......
  • python(48) 进程,线程 ,协程、
    python(48):进程,线程,协程、区别进程:拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程拥有自己的栈空间。对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。......
  • Python web crawler(2.1)多循环嵌套练习
    写个函数,传入(书名:book,标题:tittle,内容:content),要求在book文件夹下(不存在则创建),创建每个tittle.txt文件,写入content内容importosdefsave_to_file(folder_book,title,content):#如果文件夹不存在,则创建ifnotos.path.exists(folder_book):os.makedirs(......
  • python之生成器
    1.生成器优势节省空间:生成器按需生成值,避免了一次性加载所有数据到内存中。这对于处理大型数据集尤其重要。惰性计算:生成器支持惰性计算,只有在需要时才计算值。这在处理无限序列或需要动态生成数据的场景中非常有用。一次性使用:生成器通常是一次性的,一旦遍历完毕,就需要重新创......
  • locust+python性能测试库
    一.简介locust官网介绍:Locust是一个用于HTTP和其他协议的开源性能/负载测试工具。其对开发人员友好的方法允许您在常规Python代码中定义测试。Locust测试可以从命令行运行,也可以使用其基于Web的UI运行。可以实时查看吞吐量、响应时间和错误和/或导出以供以后分析。二.......
  • Python并发编程之进程池,线程池与信号量
    【一】进程池和线程池【0】池池的概念:资源管理:池用于管理和维护一组资源(如进程或线程),而不是每次需要时都创建和销毁这些资源。这有助于减少创建和销毁的开销。并发处理:池允许并发地执行多个任务,每个任务由池中的一个资源处理。这提高了程序的并发性能。任务队列:池通......
  • python之装饰器使用场景
    1.用户登录认证有三个界面需要登录认证通过后才能查看一个登录函数作为装饰器调用使用@函数名调用中如果加参数,则装饰器需要再加一层1deflogin(func):2defdesc(*args,**kwargs):3user='test'4passwd='123456'5n=06......