记一次 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. 我只使用 ...
随机推荐
- 2022-1-11 控件学习4 ItemControl、ListBox、ComboBox
ItemControl itemControl前台 ItemControl后台 ItemControl一般是竖直排列的,如果需要很想排列需要使用,也可以使用 UniformGrid Columns=& ...
- 用Claude-2-100K复刻了胡锡进老师的写作风格
大家好,我是老章 最近玩心大发,用Claude-2-100K复刻了胡锡进老师的写作风格,然后用这个风格点评世间万物. 蛮有意思的,直接看效果吧: 怎么实现的呢?老章不喜欢废话,极简介绍一下步骤. 第一 ...
- Android 架构模式如何选择
作者:vivo 互联网客户端团队-Xu Jie Android架构模式飞速演进,目前已经有MVC.MVP.MVVM.MVI.到底哪一个才是自己业务场景最需要的,不深入理解的话是无法进行选择的.这篇文章 ...
- 暑假刷题记 B
动态规划 字符串 杂题 A:Animals and Puzzle B:Vanya and Treasure 根号分治. 实际上是从 \((1, 1)\) 先找一个 \(1\),再找一个 \(2\dot ...
- npm与package.json的联系
在nodejs编写的脚手架项目中,npm是不可缺少的包管理工具,当使用npm初始化时,会生成package.json文件来对项目进行整体的管理和描述 以下是新建的练习项目中package.json ...
- R2在全渠道业务线的落地
随着业务的增长,系统的高频率迭代,质量保障工作迫切需要引入更加科学高效的测试方法来助力业务高质量的交付.长城项目一期测试中,全渠道质量团队引入技术平台部R2技术,极大的提升了项目交付的质量.因此,本文 ...
- 使用redis pipeline提升性能
前言 本篇来介绍一下redis pipeline,主要是由于最近一次在帮开发同学review代码的时候,发现对redis有个循环操作可以优化.场景大概是这样的,根据某个uid要从redis查询一批数据 ...
- 论文解读(KD-UDA)《Joint Progressive Knowledge Distillation and Unsupervised Domain Adaptation》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Joint Progressive Knowledge Distillation and Unsuperv ...
- 《数据结构-C语言》单链表
@ 目录 单链表 结构定义 初始化 建立 清空 求表长 判断是否为空表 取值 查找 插入 删除 销毁 遍历打印 测试 单链表 结构定义 #include <stdio.h> #includ ...
- Codeforces Round #576 (Div. 2)
A - City Day 题意:给n,x,y和数组a[n],求最小的下标d,使得有a[d-x,d-x+1,--d-1,d+1,d-1,d+1,--d+y-1,d+y]都比a[d]小,若d-x<= ...