Rails:将Tempfile传递给Sidekiq

时间:2016-04-20 17:17:16

标签: ruby-on-rails sidekiq

我在邮件端点上工作,将附件收集为Tempfile,然后我需要将它们传递给Sidekiq Worker,以将它们上传到AWS。

我的问题是,我一直试图坚持Tempfile,然后在我的工作人员中打开它。我不知道应该打开我的Tempfile(路径,文件名......)。

这是我的函数,它将调用worker:

if @email
    # Remove Tempfile autodelete
    @email.attachments.each {|t| ObjectSpace.undefine_finalizer(t.tempfile)}

    # Griddler Email to hash for Sidekiq
    email = {
        attachments: @email.attachments.map {|att| {
            type: att.content_type,
            name: att.original_filename
        }},
        raw_text: @email.raw_text,
        raw_html: @email.raw_html,
        from: @email.from,
        subject: @email.subject,
        to: @email.to,
        cc: @email.cc
    }

    EmailResponseWorker.perform_async email
end

在这里,我使用ObjectSpace.undefine_finalizer(t.tempfile)来禁用自动删除。

然后在我的Sidekiq工人:

def perform(email)
  @email = email

  attachments = @email['attachments'].inject([]) do |arr, file|
    object = S3_BUCKET.objects["attachments/#{SecureRandom.uuid}/#{file['name']}"].write(Tempfile.open(file['name']), acl: :public_read)
    arr << {url: object.public_url.to_s, type: file['type'], name: file['name']}
  end
end

此处附件[&#39; name&#39;]是文件的名称。

1 个答案:

答案 0 :(得分:5)

从临时文件中获取path并将其作为通常的文件路径处理:

path: att.tempfile.path

它是临时文件本身的路径,original_filename是客户端传递的文件名,而不是您需要的文件名。

在作业成功完成后,不要忘记取消链接。