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



使用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"
}

在文档之后,我们通过保存返回的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个错误请求"吗?信息不够)。提前感谢!

这是我们的桶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'

提前感谢!

2.1.02.2.0的载波版本最终解决了这个问题。不需要其他更改。

相关内容

最新更新