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.0
到2.2.0
的CarrierWave 版本最终解决了这个问题。无需进行其他更改。
【讨论】:
以上是关于Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像的主要内容,如果未能解决你的问题,请参考以下文章
markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails