小编Bla*_*gel的帖子

ActiveStorage 是否可以创建用于直接上传的 blob 并将其附加到模型,然后再上传完成?

我正在创建一个包含文件上传服务的 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

4
推荐指数
1
解决办法
4256
查看次数