使用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.0
到2.2.0
的载波版本最终解决了这个问题。不需要其他更改。