`rake uploads:migrate_to_s3` 因 `Aws::S3::Errors::SignatureDoesNotMatch` 失败

使用 rake uploads:migrate_to_s3 将本地文件上传到 DigitalOcean Spaces (S3) 时,迁移会启动并处理部分文件,随后突然因错误 Aws::S3::Errors::SignatureDoesNotMatch 而针对某个文件失败。

当按照 Extend S3 configuration for other S3 API compatible services - #4 by rishabh 中提到的脚本手动上传该文件并重新运行脚本时,它会继续上传更多文件,但随后又会在另一个文件处失败。

能否请团队中的某人帮忙查看一下?我目前有近 50GB 的文件需要在不久的将来从本地存储迁移到 S3(新文件的配置和上传功能运行正常)。

即使只是一个临时的变通方案我也很感激:我已经查看了 to_s3_migration.rb 代码,能够识别出有问题的文件,但当我使用上述脚本中的 Aws::S3::Resource 将它们上传到 S3 时,文件元数据会丢失,且下载时原始文件名也会丢失。

网络搜索返回了大量关于 SignatureDoesNotMatch 的问题:其中一条提到该 gem 使用的签名算法版本可能不正确,但这超出了我目前的技能范围去验证。

以下是 rake 的配置:

DISCOURSE_S3_ACCESS_KEY_ID="id" \
DISCOURSE_S3_SECRET_ACCESS_KEY="secret" \
DISCOURSE_S3_REGION="sfo2" \
DISCOURSE_S3_BUCKET="mybucket/uploads" \
DISCOURSE_S3_ENDPOINT="https://sfo2.digitaloceanspaces.com" \
DISCOURSE_S3_CDN_URL="https://mybucket.sfo2.cdn.digitaloceanspaces.com" \
rake uploads:migrate_to_s3 --trace

结果发现,DO Spaces 不支持文件元数据中的连续空格,并会报错一个完全无关的错误。或许值得检查一下 AWS S3 是否有同样的限制。

无论如何,快速的解决方法是将多个空格合并为一个:

              %Q{attachment; filename="#{upload.original_filename.gsub(/\s+/, ' ')}"}

这是正式修订吗?S3 迁移中的其他错误如何处理?