繁体   English   中英

使用模型ID直接在“新”操作中上传S3?

[英]Using model ID for direct S3 upload in 'new' action?

我目前正在使用jQuery文件上传直接在我的rails应用程序中上传到S3。

我有一个pm_report,里面有3张照片,并且正在上传它们,而在现有报告中没有任何问题。

当我尝试创建新报告时会出现问题,因为它会尝试在将报告保存到数据库之前为要上传的照片建立路径(该报告尚无ID)。

我所拥有的

pm_reports_controller.rb

...
before_action :set_s3_direct_post, only: [:new, :edit, :create, :update]
...
private
...
  def set_s3_direct_post
      @s3_direct_post = S3_BUCKET.presigned_post(key: "pm_reports/#{@pm_report.id}/${filename}", success_action_status: '201', acl: 'private')
  end

我要完成的工作 :将报告的3张图像保存在S3上pm_reports中的自己的文件夹中。

有没有一种方法可以解决此问题,或者可以采用其他方法?

编辑 :找到了一个更好的解决方案。

逻辑是这样的。

为您的应用创建第二个存储桶,将规则设置为在x天内自动删除。 使用jQuery文件直接上传到S3临时存储区。 然后在模型中添加一个after_commit回调,以便您可以使用aws-sdk gem将对象从一个存储桶复制到另一个存储桶,从而将临时上传路径更改为其最终路径。

这使我可以为对象添加一个固定名称,因为它适合我的问题,因此,在进行回调之后,我设置了最终路径,然后将其显示在视图上的image_tag上。

如果有人请我详细说明并放一些代码。



我使用uuid作为Brent在他的评论中指出的另一种方法。

我不得不改变一些事情:

添加迁移

class AddUuidToPmReports < ActiveRecord::Migration
   def change
     add_column :pm_reports, :uuid, :uuid
   end
end

更改pm_reports_controller.rb,以便在“ new”操作之后和“ edit”操作之前设置s3直接发布。 另外,更改预签名帖子的键以使用uuid并将其作为强参数接受。

...
before_action :set_s3_direct_post, only: :edit
...
def new
    @pm_report = PmReport.new
    @pm_report.uuid = SecureRandom.uuid
    set_s3_direct_post
end
...
private
...
def pm_report_params
      params.require(:pm_report).permit( ..., :uuid)
    end

  def set_s3_direct_post
      @s3_direct_post = S3_BUCKET.presigned_post(key: "pm_reports/#{@pm_report.uuid}/${filename}", success_action_status: '201', acl: 'private')
  end

最后,为要通过表单传递的uuid添加一个隐藏字段,以便我们保存它。

查看/pm_reports/_form.html.erb

<%= form_for @pm_report, ... %>
...
<%= f.hidden_field(:uuid) %>
...
<%= f.submit %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM