记一次 OSS 大批量文件下载的实现 → bat脚本不好玩!
开心一刻
一天夜里,侄女跟我哥聊天
侄女一脸期待的看着我哥:爸爸,你说妈妈和奶奶谁漂亮啊?
我哥不慌不忙的拿起一粒瓜子,轻声说道:为啥没有你啊?
侄女笑容渐起,似乎得到了她想要的回答,仍继续问道:那妈妈和奶奶还有我,谁漂亮?
我哥瞄了一眼侄女,又拿起一粒瓜子坚定的说到:奶奶!
侄女笑脸瞬间一拉,死死地盯着我哥,幽怨地问道:那里为啥要加我呀?
我哥再次瞄了一眼侄女,继续剥着瓜子说到:我不想让你妈妈垫底!
侄女斜眼瞟向我哥,脸上写满了愤怒

一旁的我,肚子笑疼了!
背景需求
背景
项目基于 SpringBoot ,采用 B/S 模式
主要功能是生成文件,然后将文件上传都 OSS
目前通过浏览器可以下载少量文件,但一旦文件过多或文件过大(总体来说就是过大),浏览器下载会很慢,极其容易超时而失败
需求
而最近频繁接到产品那边的反馈,说是要下载最近几个月,甚至两三年的某些文件
总之就是要支持大批量文件的下载
大批量下载实现
既然业务部门发话了,作为支撑部门,必须得全力以赴,那就整呗
阿里云oss提供了三种下载文件的方式:简单下载、断点续传下载、授权给第三方下载
我们只看简单下载,其他两种方式大家自行去了解
简单下载方式也分好几种,我们一个个来看
OSS控制台
OSS控制台指的就是

然后按照如下步骤进行文件下载

但有2点需要注意
1、不支持通过OSS控制台下载文件夹(包含子目录)
如果需要下载文件夹(包含子目录),您可以使用ossbrowser、ossutil、SDK、API等方式进行下载
2、通过OSS控制台可一次批量下载最多100个文件
最多只能下载100个文件,多不了一点
很显然这种方式不合适
1、文件上传到OSS的路径规则导致每个文件都在不同的文件夹下,结果就是只能一个一个文件下载
效率太低,谁操作谁得骂娘
2、批量下载的文件数据很容易超过100
图形化管理工具ossbrowser
关于 ossbrowser 不做过多介绍,大家直接查阅官网即可:图形化管理工具ossbrowser
简单点来说, ossbrowser 就是 OSS控制台 的 C 端

所以也不合适,不合适点和 OSS控制台 方式一样
阿里云SDK
目前已实现的少量文件的下载,就是通过此种方式实现的
产品通过浏览器请求后端,后端通过 阿里云SDK 将文件下载到后端服务器,下载完成之后进行打包,最后将打包文件以流的方式通过浏览器保存到产品电脑的指定文件夹下
一旦打包文件很大,通过浏览器就很容易超时失败
那就不通过浏览器呗,后端将打包文件上传到指定的FTP服务器的指定目录下,然后产品去FTP服务器上的指定目录下拿打包文件
看似可行,但还是有一些不容忽视的不足
1、需要一台FTP服务器,而且需要对这台FTP服务器进行维护
2、产品需要从FTP拿打包文件,如果打包文件很大,这个复制过程也很费时
所以这种方式也不是很合适
命令行工具ossutil
关于 ossutil ,命令行工具ossutil已经讲的很详细了
使用 ossutil 之前,需要先配置它,大家按照配置ossutil配置即可
需要强调的一点是,如果仅仅只是下载,那么配置的时候用 bucket 的只读账号即可
本次下载只用到了ls、cp两个命令,我们来看下这两个命令的使用
ossutil64 ls oss://qsl-yzb-test/UserData/9088/20230920

ossutil64 cp oss://qsl-yzb-test/UserData/9088/20230920/Snipaste_2023-09-25_16-24-39.png D:\qsl-yzb-test\20230920\

我们发现,文件已经下载到 D:\qsl-yzb-test\20230920 目录下

感觉跟需求很吻合,如果能从单个下载改成批量下载,那么需求就实现了
一次输入一个 CMD 命令,显然是不行的,需要以 bat 脚本的方式实现多命令的执行,完成文件的下载
假设我们要下载 1011、9088、9999 这三个资源202308、202309两个月的文件, bat 脚本该如何写?
我们用两个配置文件来配置资源和月份,类似如下

bat 的 for 很强大,尤其以 for /f 最强,格式如下

分别对应文件、字符串、命令
我们先用 for /f 来读取两个配置文件

执行结果如下

有 2 点需要注意
1、 cmd 下,变量用一个 % 来表示,比如 %r,示例:

但是批处理(bat脚本)时,变量需要 %% 来表示,比如 %%r
2、for命令的形式变量只能是26个字母中的任意一个,同时区分大小写
配置文件的解析已经实现,接下来需要结合 ossutil 的命令来实现文件的下载了
一步一步来,我们先结合 ossutil 的 ls 命令获取文件列表
ossutil64 ls oss://qsl-yzb-test/UserData/9999/202309 结果如下

我们关注的其实只是 ObjectName 那一列,而 for /f 正好能实现
for /f "tokens=8 delims= " %p in ('ossutil64 ls oss://qsl-yzb-test/UserData/9999/202309') do echo %p
效果如下

delims=符号列表 :以指定符号列表对字符串进行切割,如果没有指定 delims ,那么默认则以空格键或跳格键作为分隔符号
for /f "delims= " 和 for /f 是一样的效果
tokens=n :定点提取第 n 个字符串
tokens 后可以接多个数字,以逗号隔开,例如: tokens=2,5,8
delims 进行切割, tokens 获取切割后指定位置的字符串
放进 bat 脚本

执行结果如下

我们需要的是文件列表,不需要关注目录,那如何过滤掉目录了?
ossutil 的 ls 命令正好有 --include 参数能实现过滤

执行结果如下

oss文件路径已经获取到,接下来就是结合 cp 命令进行下载了

执行后, D:\qsl-yzb-test 目录下文件如下

离成功还差一步之遥,需要将文件按日期进行划分,比如 20230921 这天的所有文件全部放到 20230921 这个目录下
oss文件路径是有规则的,具体文件名的上一级目录就是日期目录,所以我们可以从oss路径中截取日期目录, for /f 正好能实现

执行后, D:\qsl-yzb-test 目录内容如下

自此,算是大功告成了
但如果能手动指定下载目录就好了(下载目录作为 bat 参数)
这个很简单,直接上代码

完整脚本代码

@ECHO OFF
rem 字符编码设置成UTF-8编码,防止中文乱码
chcp 65001 rem %1 下载目录
if "%1"=="" (
echo "请指定下载目录,类似 D:\qsl-yzb-test"
goto :eof
) for /f %%r in (resource_config.txt) do (
for /f %%m in (month_config.txt) do (
for /f "tokens=8 delims= " %%p in ('ossutil64 ls oss://qsl-yzb-test/UserData/%%r/%%m --include *.*') do (
for /f "tokens=5 delims=/" %%d in ("%%p") do (
rem -f表示同名覆盖
ossutil64 cp %%p %1\%%d\ -f
)
)
)
)
REST API
自定义要求较高的情况可以考虑这种方式,感兴趣的可以去看官方说明
总结
1、 ossutil 提供了很多命令,实现需求之前可以先翻一翻官方文档说明
2、 cmd 和 bat 的变量命名是有区别的,大家一定要注意
3、 for 很强大, for /f 强大的最突出
参考
记一次 OSS 大批量文件下载的实现 → bat脚本不好玩!的更多相关文章
- 学习篇:TypeCodes的2015年博客升级记
原文: https://typecodes.com/mix/2015updateblog.html 2015年博客升级记 作者:vfhky | 时间:2015-05-23 17:25 | 分类:mix ...
- SQL server数据异地备份到OSS
背景需求: 某部门需要将windows机器上的SQL server数据做一个异地备份,经过对现有的软硬件资源评估,决定使用阿里云的OSS存储 方法:利用SQLserver自带的维护计划做指定数据库的备 ...
- [转]Bat脚本处理ftp超强案例解说
Bat脚本处理ftp超强案例解说 转自:http://369369.blog.51cto.com/319630/842341 前言: 公司有几百台windows服务器,每次程序更新,如果是一台 ...
- Bat脚本处理ftp超强案例解说
Bat脚本处理ftp超强案例解说 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://369369.blog.51cto.com/31 ...
- 阿里云server安全设定
1.打开所有的服务云盾 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVkaWFlbF9sdQ==/font/5a6L5L2T/fontsize/400 ...
- 在windows上搭建镜像yum站的方法(附bat脚本)
方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mirrors.ustc.edu.cn 都存在镜像. 同时 http://mirrors.ust ...
- 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器
摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...
- 在windows上搭建镜像yum站的方法
在windows上搭建镜像yum站的方法(附bat脚本) 分类: 运维基本功,其他 方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mi ...
- 阿里云服务器安全设置 分类: B3_LINUX 2014-07-24 11:10 5197人阅读 评论(1) 收藏
1.开启云盾所有服务 2.通过防火墙策略限制对外扫描行为 请您根据您的服务器操作系统,下载对应的脚本运行,运行后您的防火墙策略会封禁对外发包的行为,确保您的主机不会再出现恶意发包的情况,为您进行后续数 ...
- MongoDB一键式安装工具
一. 需求 不知道有多少人会像我一样,会把MongoDB用在客户端应用上,不过我感觉应该非常少.于是,我就希望能在客户机器上尽可能简单方便的安装MongoDB.所以以下是我的一些取舍: 1. 我只使用 ...
随机推荐
- Object.equals 和 String.equals的区别
一. 源码展示: 1. Object.equals: ①引用类型地址值比较,直接返回结果:true || false public class Object { public boolean equ ...
- zabbix 可计算监控项使用 last() 与 avg() 的区别
使用zabbix的可计算监控项时遇到的问题 在agent异常退出的情况下,使用last()的监控项依然在产出数据! 分析解决 last()函数会跳过空值,取最后一个有效值计算.遍查文档,只有用avg( ...
- Diffusers 一岁啦 !
十分高兴 Diffusers 迎来它的一岁生日!这是令人激动的一年,感谢社区和开源贡献者,我们对我们的工作感到十分骄傲和自豪.去年,文本到图像的模型,如 DALL-E 2, Imagen, 和 Sta ...
- 给你推荐一款快速通过 typescript 生成 jsonschema 的包处理器
theme: github fast-typescript-to-jsonschema Typescript 生成 jsonschema 数据插件 性能 案例 interface AAA { a: n ...
- PLE-实践小结-2308-cnblogs
某场景介绍 前状:三模型,权重融合 解决问题:融合目标行为,充分利用样本信息,节省资源开销. 当前效果 主场景人均真实曝光+0.26%,不显著:子场景人均真实曝光+0.35%,不显著 千曝互动+2.6 ...
- AI绘画工具MJ新功能有点东西,小白也能轻松一键换装
先看最终做出来的效果 直接来干货吧.Midjourney,下面简称MJ 1.局部重绘功能来袭 就在前两天,MJ悄咪咪上线了这个被众人期待的新功能:局部重绘. 对于那些追求创新和个性化的设计师来说,局部 ...
- mysql关键字匹配度模糊查询
有时候项目中需要进行模糊查询,但是要对查询出来的结果进行匹配度排序,比如搜索关键字是"北",需要把数据库中第一个字是北的排在前面,此时就可以用mysql的INSTR函数. INST ...
- Java 中的日期时间总结
前言 大家好,我是 god23bin,在日常开发中,我们经常需要处理日期和时间,日期和时间可以说是一定会用到的,现在总结下 Java 中日期与时间的基本概念与一些常用的用法. 基本概念 日期(年月日, ...
- KRPANO资源分析工具下载四方环视全景图
提示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师 ...
- Note -「普通生成函数 OGF」
\(\mathbf{OGF}\) 的定义 对于一个序列 \(a_{1},a_{2},\cdots\),我们称: \[G(x)=\sum_{i=0}^{\infty}a_{i}x^{i} \] 为序列 ...