七牛云存储文件下载程序,匹配 HTML 的七牛云存储的文件名,并使用 qrsctl 下载文件
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.vscode
QrsctlGet.cpp
README.md
qrsctl.exe

README.md

QrsctlGet

此仓库是博文 解决七牛云链接失效以及批量下载图片并迁移阿里云 OSS 的存储仓库,请参考博文使用。

下载七牛存储的对象

使用 qrsctl 工具只能单个文件下载,为了避免重复的工作,因此写了个 C++ 程序解决。

获取包含所有对象名的 html 文件

首先进入七牛云要下载的 bucket(存储空间)的 web 界面,把内容管理列表中全部对象显示出来(点底部加载更多直到全部显示),在 Chrome 浏览器 右键 - 检查,如下图,选中 tbody - 右键 - Copy - Copy element

QiniuStorageSpaceTbody

然后把复制到的内容保存成 html.html 文件,放到一个目录下,如我的 D:\code\test\(以下均以此目录为工程目录)

下载并登录 qrsctl

下载 命令行辅助工具(qrsctl),保存到 D:\code\test\ 目录,并重命名为 qrsctl.exe

D:\code\test\ 目录的 CMD 或 PowerShell 中输入如下命令登录你的七牛账号

.\qrsctl.exe login huihut@outlook.com 123   # 假设密码为 123

编写批量下载程序

D:\code\test\ 下创建个 QrsctlGet.cpp,把下面 C++ 代码保存到刚创建的文件,修改存储空间名为你的存储空间名的名字(本文为 temp),用 VS Code 或其他工具编译运行,七牛存储的文件即会下载到同目录下。

//==============================================================
//  作者:huihut
//  邮箱:huihut@outlook.com
//  时间:2018-11-08 14:28:00
//  说明:匹配 HTML 的七牛云存储的文件名,并使用 qrsctl 下载文件
//==============================================================

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <regex>
using namespace std;

int main()
{
	// 存储空间名【需要修改为你的存储空间名】
	string bucket = "temp";

	// 打开 html 文件
	ifstream fhtml;
	fhtml.open("html.html");

	// 统计下载的文件对象数
	int num = 0;

	if (fhtml)
	{
		// tbody 里面符合 reg 的奇数为文件对象,偶数是文件类型,因此只取奇数匹配项
		bool isObj = true;
		std::stringstream buffer;
		buffer << fhtml.rdbuf();
		std::string contents(buffer.str());
		std::smatch match;
		std::regex reg("\\b(edit-word ng-binding\">)([^<]*)");
		while (std::regex_search(contents, match, reg)) {
			if (isObj)
			{
				// 匹配到的文件对象
				string objfile = match.format("$2");
				cout << "Matched " + objfile << endl;

				// 合成下载命令
				string command = "qrsctl.exe get " + bucket + " " + objfile + " ./" + objfile;

				// 下载文件
				cout << "Download " + objfile + "..." << endl;
				system(command.c_str());

				// 文件个数加一
				num++;

				// 下一个非文件对象
				isObj = false;
			}
			else
			{
				// 下一个是文件对象
				isObj = true;
			}
			contents = match.suffix().str();
		}
	}
	else
	{
		cerr << "Failed to read html file!" << endl;
		system("pause");
		return -1;
	}

	cout << "Downloaded " + to_string(num) + " files." << endl;
	system("pause");
	return 0;
}

QiniuQrsctlDownload