我正在创建一个包含文件上传服务的 api,其中上传的文件可以包含用户输入的额外信息,存储在项目模型中。当客户端请求从服务器直接上传时,我还想创建一个新项目并在客户端上传到 S3 时附加 blob。但是,如果 S3 中尚不存在 Blob,则 ActiveStorage 似乎不允许附加 Blob。
我考虑了何时附加 Blob 的几个不同选项,但我认为在创建 Blob 和直接上传凭据时执行此操作是满足我需求的最佳选择。由于我需要一些 ActiveStorage 提供的默认控制器未涵盖的额外逻辑,因此我编写了自己的逻辑。在其中,我创建用于直接上传的 blob,创建项目,将 blob 附加到项目,并返回签名的上传 url、标题和项目 ID。但是,Aws::S3::Errors::NoSuchKey当我尝试将 blob 附加到项目时,它给了我一个错误。
在我的控制器中:
Project.transaction do
# Create a project with default attributes
project = create_draft_project(project_title)
# Create a blob before direct upload to generate a signed url
blob = ActiveStorage::Blob.create_before_direct_upload!(
filename: filename,
byte_size: byte_size,
checksum: checksum,
content_type: content_type
)
# Attach the blob to the project. This is where it errors.
project.file.attach(blob.signed_id)
end
# Render …Run Code Online (Sandbox Code Playgroud) ruby-on-rails amazon-s3 rails-activerecord rails-activestorage