前言

我的博客图床一直放在又拍云。用了挺长时间,图片访问也一直稳定,直到最近,又拍云那边开始出现一些不太对劲的信号。

先是登录控制台收不到短信验证码,接着是数据迁移工具反复报错。折腾了一圈之后,我最终把整个图床从又拍云迁到了七牛云。这篇文章记录一下这次迁移的完整过程,包括踩过的坑和最后真正管用的方法。

2026-10-13T15:25:44-sragyhka.png


为什么要迁移

直接原因很简单:又拍云的服务状态变得不可靠了。

具体表现有几个:

  • 登录控制台时,短信验证码一直收不到,导致无法进入后台;
  • 公开信息显示,又拍云近期存在经营层面的风险,包括被法院签发限制高消费令、多起被执行案件,以及部分业务下线(如又拍云联盟下架了)。

对于一个依赖图床的博客来说,图床服务不稳定是致命的。图片一旦打不开,读者体验会直接崩掉。所以我决定尽快把数据迁走。

2026-10-13T15:25:44-ijopghva.png


迁移过程中遇到的第一个坑:迁移工具报“bucket is empty”

最开始,我使用的是七牛云自带的数据迁移工具,按照正常流程填写了又拍云的 Endpoint、AccessKey、SecretKey 和桶名,结果任务直接失败:

失败原因:bucket is empty
文件数:0 个失败 / 0 个成功 / 0 个跳过 / 0 个待迁移

一开始我怀疑是 HTTPS 证书过期导致的,但仔细想了一下,这个判断不成立。HTTPS 证书只影响浏览器访问域名时的加密,不影响对象存储 API 的鉴权。 迁移工具走的是 S3 兼容 API,和浏览器打开图片是两条完全不同的通道。

真正的原因,是我无法登录又拍云控制台,也就无法确认或重新获取正确的 S3 API 密钥。虽然博客后台里保存着之前配置的密钥,但七牛云的迁移工具那边,很可能在某个参数上没对上。

2026-10-13T15:25:44-wicktnwr.png


转折点:用 rclone验证又拍云 API 是否可用

既然七牛云的工具走不通,我决定换一个更底层、更可控的工具来验证:rclone。

rclone 是一个命令行工具,支持几乎所有主流对象存储的 S3 兼容接口。用它来测试又拍云,可以绕开七牛云迁移工具本身的配置问题,直接判断“又拍云的密钥和桶到底能不能读”。

第一步:安装并配置 rclone

下载 rclone 后解压,在命令行里执行:

.\rclone.exe config file

它会告诉你配置文件的路径。我的路径是:

C:\Users\herbert\AppData\Roaming\rclone\rclone.conf

然后手动创建这个文件,写入又拍云的配置:

[upyun]
type = s3
provider = Other
access_key_id = 你的又拍云AccessKey
secret_access_key = 你的又拍云SecretKey
endpoint = s3.api.upyun.com

这里的 AccessKey 和 SecretKey,是我从博客后台保存的又拍云 S3 配置里找到的。这一点很关键——正因为博客后台还留着这对密钥,我才能在登录不上又拍云的情况下,继续通过 API 访问数据。

第二步:验证连接

执行:

.\rclone.exe ls upyun:你的桶名

结果成功列出了大量文件。这说明:

  • 又拍云的 S3 API 密钥是有效的;
  • 桶名 你的桶名 是正确的;
  • 数据还在,没有被清空。

问题彻底定位了:不是又拍云读不到数据,而是我在七牛云迁移工具的配置有问题。

2026-10-13T15:25:44-bfmjpaxz.png


正式迁移:用 rclone 把数据从又拍云复制到七牛云

既然 rclone 能正常读取又拍云,我决定直接用 rclone 把数据复制到七牛云,绕开七牛云自带的迁移工具。

第一步:配置七牛云

在同一个 rclone.conf 文件里,追加七牛云的配置。我的七牛云空间在华南-广东区域,所以 endpoint 是:

[qiniu]
type = s3
provider = Other
access_key_id = 你的七牛云AccessKey
secret_access_key = 你的七牛云SecretKey
endpoint = s3.cn-south-1.qiniucs.com

七牛云的 AccessKey 和 SecretKey 在控制台的“密钥管理”里获取。

第二步:验证七牛云连接

.\rclone.exe ls qiniu:image-blog-kk

不报错就说明配置成功。

第三步:查看源端文件总量

在正式迁移前,先统计一下又拍云那边的文件数量:

.\rclone.exe size upyun:image-blog-kk

输出结果:

Total objects: 189.524k (189524)
Total size: 256.797 MiB (269271463 Byte)

将近 19 万个文件,但总大小只有约 257 MiB。这说明文件数量多、单个文件小,迁移的瓶颈不在带宽,而在请求次数和并发能力。

第四步:排除不需要迁移的目录

又拍云桶里有一些日志目录和不需要的文件夹,迁移前用 --exclude 排除掉:

.\rclone.exe copy upyun:image-blog-kk qiniu:image-blog-kk -P --transfers 32 --checkers 32 --exclude "upyun_storage_log_*/**" --exclude "blog/edgeone/**"

参数说明:

  • -P:显示实时进度;
  • --transfers 32:同时传输 32 个文件,针对海量小文件场景提高并发;
  • --checkers 32:并发检查数;
  • --exclude:排除指定目录。

第五步:校验一致性

迁移完成后,执行校验:

.\rclone.exe check upyun:image-blog-kk qiniu:image-blog-kk --exclude "upyun_storage_log_*/**" --exclude "blog/edgeone/**"

如果显示 0 differences found,就说明两边数据完全一致。


迁移后的收尾工作

数据迁完之后,还需要做几件事:

  1. 确认博客图片正常显示:打开几篇带图的文章,确认图片都能正常加载;
  2. 配置七牛云自定义域名和 HTTPS 证书:确保访问安全;
  3. 处理又拍云账户:如果还有余额,尽早申请提现;确认没有自动续费或按量计费还在跑;
  4. 重置暴露的密钥:迁移过程中如果密钥曾经暴露,建议在又拍云和七牛云分别重置。

2026-10-13T15:25:46-ktwpkckb.png


总结

这次迁移的核心难点,不在于数据本身有多大,而在于源端服务不可登录、迁移工具报错、问题定位困难。

真正解决问题的关键有两个:

  1. 博客后台保存了又拍云的 S3 密钥,让我在登录不上控制台的情况下,依然能通过 API 访问数据;
  2. rclone 作为底层验证工具,绕开了七牛云迁移工具的配置问题,直接确认了源端数据可用,并最终完成了迁移。

如果你也在使用第三方图床或对象存储,建议提前做好两件事:

  • 在安全的地方备份一份云存储的密钥信息;
  • 了解并掌握 rclone 这类命令行工具的基本用法,关键时刻能救服务器。