根据文件类型处理文件 [Gem Shrine]
Process file base on filetype [Gem Shrine]
我在表单中有一个字段,用户可以在其中上传图像或文档(pdf、word、excel 等)。如何告诉 Shrine 上传器根据文件类型处理上传的文件。
class FileUploader < Shrine
plugin :processing
plugin :versions
plugin :delete_raw
plugin :validation_helpers
if File_is_image # <------ what to write here?
# do image processing
process(:store) do |io, context|
original = io.download
pipeline = ImageProcessing::MiniMagick.source(original)
size_800 = pipeline.resize_to_limit!(800, 800)
size_300 = pipeline.resize_to_limit!(300, 300)
original.close!
{ original: io, large: size_800, small: size_300 }
end
else
#do non image file processing
end
end
或者有更好的方法吗?
产生给进程块的 io
对象是一个 Shrine::UploadedFile
对象,它包含有关原始文件的所有元数据。您使用此信息跳过基于 MIME 类型的处理:
IMAGE_TYPES = %w[image/jpeg image/png image/gif]
process(:store) do |io, context|
next io unless IMAGE_TYPES.include?(io.mime_type)
original = io.download
pipeline = ImageProcessing::MiniMagick.source(original)
size_800 = pipeline.resize_to_limit!(800, 800)
size_300 = pipeline.resize_to_limit!(300, 300)
original.close!
{ original: io, large: size_800, small: size_300 }
end
这里使用 next
ruby 关键字来 return 从一个块开始。
我在表单中有一个字段,用户可以在其中上传图像或文档(pdf、word、excel 等)。如何告诉 Shrine 上传器根据文件类型处理上传的文件。
class FileUploader < Shrine
plugin :processing
plugin :versions
plugin :delete_raw
plugin :validation_helpers
if File_is_image # <------ what to write here?
# do image processing
process(:store) do |io, context|
original = io.download
pipeline = ImageProcessing::MiniMagick.source(original)
size_800 = pipeline.resize_to_limit!(800, 800)
size_300 = pipeline.resize_to_limit!(300, 300)
original.close!
{ original: io, large: size_800, small: size_300 }
end
else
#do non image file processing
end
end
或者有更好的方法吗?
产生给进程块的 io
对象是一个 Shrine::UploadedFile
对象,它包含有关原始文件的所有元数据。您使用此信息跳过基于 MIME 类型的处理:
IMAGE_TYPES = %w[image/jpeg image/png image/gif]
process(:store) do |io, context|
next io unless IMAGE_TYPES.include?(io.mime_type)
original = io.download
pipeline = ImageProcessing::MiniMagick.source(original)
size_800 = pipeline.resize_to_limit!(800, 800)
size_300 = pipeline.resize_to_limit!(300, 300)
original.close!
{ original: io, large: size_800, small: size_300 }
end
这里使用 next
ruby 关键字来 return 从一个块开始。