开心一刻

  一天夜里,侄女跟我哥聊天

  侄女一脸期待的看着我哥:爸爸,你说妈妈和奶奶谁漂亮啊?

  我哥不慌不忙的拿起一粒瓜子,轻声说道:为啥没有你啊?

  侄女笑容渐起,似乎得到了她想要的回答,仍继续问道:那妈妈和奶奶还有我,谁漂亮?

  我哥瞄了一眼侄女,又拿起一粒瓜子坚定的说到:奶奶!

  侄女笑脸瞬间一拉,死死地盯着我哥,幽怨地问道:那里为啥要加我呀?

  我哥再次瞄了一眼侄女,继续剥着瓜子说到:我不想让你妈妈垫底!

  侄女斜眼瞟向我哥,脸上写满了愤怒

  一旁的我,肚子笑疼了!

背景需求

  背景

  项目基于 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 的只读账号即可

  本次下载只用到了lscp两个命令,我们来看下这两个命令的使用

   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 强大的最突出

参考

  批处理for语句从入门到精通

记一次 OSS 大批量文件下载的实现 → bat脚本不好玩!的更多相关文章

  1. 学习篇:TypeCodes的2015年博客升级记

    原文: https://typecodes.com/mix/2015updateblog.html 2015年博客升级记 作者:vfhky | 时间:2015-05-23 17:25 | 分类:mix ...

  2. SQL server数据异地备份到OSS

    背景需求: 某部门需要将windows机器上的SQL server数据做一个异地备份,经过对现有的软硬件资源评估,决定使用阿里云的OSS存储 方法:利用SQLserver自带的维护计划做指定数据库的备 ...

  3. [转]Bat脚本处理ftp超强案例解说

    Bat脚本处理ftp超强案例解说 转自:http://369369.blog.51cto.com/319630/842341   前言:   公司有几百台windows服务器,每次程序更新,如果是一台 ...

  4. Bat脚本处理ftp超强案例解说

    Bat脚本处理ftp超强案例解说 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://369369.blog.51cto.com/31 ...

  5. 阿里云server安全设定

    1.打开所有的服务云盾 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVkaWFlbF9sdQ==/font/5a6L5L2T/fontsize/400 ...

  6. 在windows上搭建镜像yum站的方法(附bat脚本)

    方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mirrors.ustc.edu.cn 都存在镜像. 同时 http://mirrors.ust ...

  7. 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器

    摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...

  8. 在windows上搭建镜像yum站的方法

    在windows上搭建镜像yum站的方法(附bat脚本)   分类: 运维基本功,其他   方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mi ...

  9. 阿里云服务器安全设置 分类: B3_LINUX 2014-07-24 11:10 5197人阅读 评论(1) 收藏

    1.开启云盾所有服务 2.通过防火墙策略限制对外扫描行为 请您根据您的服务器操作系统,下载对应的脚本运行,运行后您的防火墙策略会封禁对外发包的行为,确保您的主机不会再出现恶意发包的情况,为您进行后续数 ...

  10. MongoDB一键式安装工具

    一. 需求 不知道有多少人会像我一样,会把MongoDB用在客户端应用上,不过我感觉应该非常少.于是,我就希望能在客户机器上尽可能简单方便的安装MongoDB.所以以下是我的一些取舍: 1. 我只使用 ...

随机推荐

  1. [Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring ...

  2. GaussDB技术解读丨高级压缩

    本文作者|华为云数据库GaussDB首席架构师 冯柯 [背景介绍] 数据压缩与关系数据库的结合,早已不是一个新鲜的话题,当前我们已经看到了各种各样数据库压缩的产品和解决方案.对于GaussDB来说,在 ...

  3. Centos7下Oracle启动命令

    1.查询挂载历史记录 在root账户下使用一下命令 查看历史使用挂载的那个磁盘 # 查看挂载历史命令 history | grep mount # 调用挂载历史命令,主要是为了找到挂载Oracle的磁 ...

  4. debezium同步postgresql数据至kafka

    0 实验环境 全部部署于本地虚拟机 debezium docker部署 postgresql.kafka本机部署 1 postgresql 1.1 配置 设置postgres密码为123 仿照exam ...

  5. Matlab2021a打包jar包问题(linux、windows)

    都有chatgpt了,实在不想写博客....不过还是记录一下问题吧. 我们在用matlab打包jar包的时候,经常会出现打包出错的问题,但无非注意以下几点就行了: 1.打包方式 这个还是很简单的,而且 ...

  6. Verilog实现奇分频电路

    在FPGA中,计数器电路用途很广,一般计数器电路都可作为分频电路.实现占空比为50的偶分频电路很好实现.但实现占空比为50的奇分频电路有点难度.下面给出一个简单例子,记录学习奇分频电路的过程. 实现占 ...

  7. Pandas 使用教程 Series、DataFrame

    目录 Series (一维数据) 指定索引值 使用 key/value 对象,创建对象 设置 Series 名称参数 DataFrame(二维数据) 使用字典(key/value)创建 loc 属性返 ...

  8. 干货分享:用ChatGPT调教批量出Midjourney咒语,出图效率Nice ,附资料。

    Prompts就是AI绘图的核心竞争力. 您是不是觉得用Midjourney生成的图不够完美? 又让ChatGPT去生成Prompt,然后效果还不理想? 其实ChatGPT你给他投喂资料后,经过调教的 ...

  9. 如何实现IP话机接入交换机?

    组网图形 简介 如果语音设备支持LLDP协议,并且支持通过network-policy TLV字段获取语音VLAN,可以在交换机上配置命令lldp tlv-enable med-tlv network ...

  10. 命令行安装ipa包

    我们可以通过ssh连接我们的iphone,来使用命令行安装ipa包 itunnel_mux.exe --lport 9993 --iport 22 itunnel_mux.exe --lport 99 ...