经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python批量上传文件到七牛云
来源:cnblogs  作者:智客工坊  时间:2024/1/26 10:05:37  对本文有异议

导航

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

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

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

引子

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

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

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

棘手的需求

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

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

如何解决呢?

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

  1. const isProd = process.env.NODE_ENV === 'production'
  2. module.exports = {
  3. // Use the CDN in production and localhost for development.
  4. assetPrefix: isProd ? 'https://cdn.mydomain.com' : '',
  5. }

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

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

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

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

最后拼接后的地址是:

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

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

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

化繁为简

复杂的事情简单化。

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

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

根目录/_next/static/

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

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

实战案例

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

  1. # -*- coding: utf-8 -*-
  2. # author: zhikecore
  3. # https://developer.qiniu.com/kodo/1242/python#rs-stat
  4. import os;
  5. from qiniu import Auth, put_file, etag
  6. from qiniu import BucketManager
  7. # 全局变量
  8. # 需要填写你的 Access Key 和 Secret Key
  9. ACCESS_KEY='您申请的七牛云Access Key'
  10. SECRET_KEY='您申请的七牛云Secret Key'
  11. #要上传的空间
  12. BUCKET_NAME = '您申请的七牛云空间名称bucket'
  13. # 遍历文件
  14. def scan_dir(path):
  15. for root, dirs, files in os.walk(path):
  16. for file in files:
  17. filePath=os.path.join(root, file)
  18. fileDir=os.path.dirname(filePath).replace('\\','/')
  19. fileKey=fileDir.replace(path,'_next/static')+'/'+file
  20. #print('fileDir:'+fileDir+',filePath:'+filePath+',fileKey:'+fileKey)
  21. #delfileKey(fileKey)
  22. #print("del fileKey:"+fileKey+",success!")
  23. upload(filePath,fileKey)
  24. print("upload fileKey:"+fileKey+",success!")
  25. for dir in dirs:
  26. dir=os.path.join(root, dir)
  27. print(dir)
  28. def upload(filepath,fileKey):
  29. #构建鉴权对象
  30. q = Auth(ACCESS_KEY, SECRET_KEY)
  31. #要上传的空间
  32. bucket_name = BUCKET_NAME
  33. #上传后保存的文件名
  34. key=fileKey
  35. #生成上传 Token,可以指定过期时间等
  36. token = q.upload_token(bucket_name, key, 3600)
  37. #要上传文件的本地路径
  38. localfile = filepath
  39. print('key:'+key,"localfile:"+localfile)
  40. ret, info = put_file(token, key, localfile, version='v2')
  41. print(info)
  42. assert ret['key'] == key
  43. assert ret['hash'] == etag(localfile)
  44. def delfileKey(fileKey):
  45. #初始化Auth状态
  46. q = Auth(ACCESS_KEY, SECRET_KEY)
  47. #初始化BucketManager
  48. bucket = BucketManager(q)
  49. #你要测试的空间, 并且这个key在你空间中存在
  50. bucket_name = BUCKET_NAME
  51. key = fileKey
  52. #删除bucket_name 中的文件 key
  53. ret, info = bucket.delete(bucket_name, key)
  54. print(info)
  55. # 如果该文件不是被import,则执行下面代码。
  56. if __name__ == '__main__':
  57. scan_dir('./_next/static')

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

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

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



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


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

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

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

参考

原文链接:https://www.cnblogs.com/lucky_hu/p/17988315

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号