开心一刻

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

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

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

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

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

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

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

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

  一旁的我,肚子笑疼了!

背景需求

  背景

  项目基于 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. Avalonia项目打包安装包

    Avalonia项目打包安装包 要将 Avalonia 项目打包成安装包,你可以使用 Avalonia 发布工具来完成 1.创建一个发布配置文件 在你的 Avalonia 项目中,创建一个发布配置文件 ...

  2. 反汇编分析C语言

    环境 VC6.0环境 空函数反汇编 #include "stdafx.h" void function(){ } int main(int argc, char* argv[]) ...

  3. debian 防火墙命令 nft

    参考链接:nftables # which nft /usr/sbin/nft # dpkg -S /usr/sbin/nft nftables: /usr/sbin/nft # dpkg -L nf ...

  4. 关于quartus II的导入以前的工程,QSF文件出现的错误的解决方案。

    在有时候打开以前的工程,或者别人做好的例程会遇到一些报错信息.具体报错信息如下: 报错信息语句行: 在文件QSF文件中有几行出错,显示错误读取,即不能打开工程.打开文件发现该几行的PIN 使能信号处于 ...

  5. js判断h5页面地址的打开方式(微信、pc、移动端)

    1 function isOpenMode(){ 2 //平台.设备和操作系统 3 var system = { 4 win: false, 5 mac: false, 6 xll: false, 7 ...

  6. 一键部署 Umami 统计个人网站访问数据

    谈到网站统计,大家第一时间想到的肯定是 Google Analytics.然而,我们都知道 Google Analytics 会收集所有用户的信息,对数据没有任何控制和隐私保护. Google Ana ...

  7. Anaconda+PyCharm+Pytorch/tensorflow环境配置个人总结

    Anaconda是一个非常方便的python版本管理工具,可以很方便地切换不同版本的Python进行测试.同时不同版本之间也不存在相互的干扰. PyCharm是一款常见的Python IDE,pyto ...

  8. 2、Spring之IOC概述

    2.1.IOC思想 2.1.1.传统方式获取资源 组件主动地从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式: 提高了学习成本,同时也降低了开发的效率. 2. ...

  9. 【日常踩坑】解决 pip 安装第三方包时因 SSL 报错

    目录 踩坑 什么是 SSL ? 为什么会报错 解决办法 1. 临时关闭代理.VPN 或者网络抓包等软件 2. 通过镜像的 HTTP 源来避免 SSL 认证问题 3. 切换至低版本 pip 参考资料 踩 ...

  10. pandas常用的数据类型,(serises和dataform)