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
我将 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