Shrine gem with Rails:生成带有上传端点的版本?

Shrine gem with Rails: generate versions with upload endpoint?

我将 Shrine gem 与 Rails 一起使用 5. 我启用了插件 upload_endpoint、版本、处理和重新缓存。我希望在上传端点响应中获得生成的版本。

class VideoUploader < Shrine
  plugin :processing
  plugin :versions
  plugin :recache
  plugin :upload_endpoint

  plugin :upload_endpoint, rack_response: -> (uploaded_file, request) do

    # ??? I expected uploaded_file to have thumbnail version here ???

    body = { data: uploaded_file.data, url: uploaded_file.url }.to_json
    [201, { "Content-Type" => "application/json" }, [body]]
  end

  process(:recache) do |io, context|
    versions = { original: io }

    io.download do |original|
      screenshot = Tempfile.new(["screenshot", ".jpg"], binmode: true)
      movie = FFMPEG::Movie.new(original.path)
      movie.screenshot(screenshot.path)
      screenshot.open # refresh file descriptors

      versions[:thumbnail] = screenshot
    end

    versions
  end
end

为什么进程回调process(:recache)只在保存整条记录时发生?以及如何让它直接上传后立即生成版本?

:recache 操作仅在您将文件分配给模型实例并且验证成功后才会发生。所以 recache 插件不是你想要的。

每当 Shrine 上传文件时,它都会在该上传文件中包含一个 :action 参数,这就是您注册 process 块时匹配的参数。目前没有记录,但 upload_endpoint 包括 action: :upload,所以只需使用 process(:upload):

process(:upload) do |io, context|
  # ...
end

在您的 :rack_response 块中,uploaded_file 现在将是上传文件的哈希值,因此您将无法对其调用 #data。但是你可以直接将它们包含在哈希中,它们应该会自动转换为 JSON.

  plugin :upload_endpoint, rack_response: -> (uploaded_file, request) do
    body = { data: uploaded_file, url: uploaded_file[:original].url }.to_json
    [201, { "Content-Type" => "application/json" }, [body]]
  end