Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像

Posted

技术标签:

【中文标题】Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像【英文标题】:Rails + CarrierwaveDirect: Unable to download and process image after successful direct upload to S3 【发布时间】:2021-11-29 08:17:59 【问题描述】:

使用 Rails 6 和 CarrierWaveDirect,我们能够成功地将文件 POST 到预签名的 S3 URL,但是在尝试将文件从 S3 下载到我们的服务器进行处理时遇到错误。

我们的模型和上传器如下所示:

# model
class FileAttachment < ApplicationRecord
  mount_uploader :file, FileUploader
end

# uploader
class FileUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader
end

S3 按预期响应我们的直接上传 (POST),如下所示:


  "bucket" => "my-bucket",
  "key" => "uploads/abcde-my-file.pdf",
  "etag" => "12345"

在docs 之后,我们通过将返回的key 属性保存到新模型来处理响应,如下所示:

@file_attachment = FileAttachment.new file_key: params[:key]
@file_attachment.save

这似乎工作正常,但是,当它尝试将文件从 S3 下载到我们的服务器进行处理时,由于 400 Bad Request 而失败:

irb(main)> @file_attachment.remote_file_url = @file_attachment.file.url
=> "https://my-bucket.s3-us-west-2.amazonaws.com/uploads/abcde-my-file.pdf?X-Amz-Expires=600&X-Amz-Date=20211009T202903Z&X-Amz-Algorithm=...&X-Amz-Credential=...&X-Amz-SignedHeaders=host&X-Amz-Signature=..."
irb(main)> @file_attachment.save
=> false
irb(main)> @file_attachment.errors.full_messages
=> ["File could not download file: 400 Bad Request"]

尽管有 400,但我可以确认 @file_attachment.file.url 是一个有效的工作 URL,并且当通过浏览器访问该 URL 时,可以正常下载文件。但由于某种原因,它无法从我们的应用程序中下载。

谁能发现我们做错了什么?或者有没有人知道更好的调试方法(“400 Bad Request”信息不足)。提前致谢!

这是我们的存储桶 CORS:

[
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "POST",
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    
]

以及我们的环境详情:

ruby '2.7.2'
gem 'rails', '~> 6.0.3'
gem 'carrierwave', '~> 2.1.0'
gem 'carrierwave_direct', '~> 2.1.0'

提前致谢!

【问题讨论】:

【参考方案1】:

2.1.02.2.0 的CarrierWave 版本最终解决了这个问题。无需进行其他更改。

【讨论】:

以上是关于Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在 Rails 6 中使用绝对路径

Rails:rails 模型的默认排序顺序?

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Rails:如何在 Rails 中为 Devise 设置密钥?

从 Rails 2 到 Rails 3 路由

Rails:在 Rails 控制器中捕获所有异常