将文件传递给活动作业/后台作业

Gra*_*ick 5 ruby-on-rails background-process resque redis sidekiq

我通过标准文件输入接收请求参数中的文件

def create
  file = params[:file]
  upload = Upload.create(file: file, filename: "img.png")
end
Run Code Online (Sandbox Code Playgroud)

但是,对于大型上传,我想在后台作业中执行此操作。Sidekiq 或 Resque 等流行的后台作业选项依赖于 Redis 来存储参数,因此我不能只通过 Redis 传递文件对象。

我可以使用Tempfile,但在某些平台(例如 Heroku)上,本地存储并不可靠。

我必须有哪些选项才能使其在“任何”平台上可靠?

小智 1

首先,您应该将文件保存在存储上(本地或 AWS S3)。然后将文件路径或uuid作为参数传递给后台作业。

我强烈建议避免在参数上传递 Tempfile。这将对象存储在内存中,该对象可能会过时,从而导致陈旧数据问题。