我正在研究Paperclip的高级用法。
我使用Paperclip在项目中上传文件(图像或视频)功能。我想为大型(例如大于1000x1000px)附加文件生成调整大小的样本。 我试过这个:
has_attached_file :upload, styles: { sample: '1000x1000>', preview: ['150x150', :jpg] },
convert_options: { sample: '-quality 90', preview: '-quality 85 -strip' }
但是此代码始终会生成样本,即使对于较小的文件也是如此。有没有办法在样本生成之前检查附加的文件尺寸?
答案 0 :(得分:1)
好的,由于lambdas和Paperclip的一些问题,我花了很长时间,比我想要的更清楚,我设法解决了这个问题:
您需要使用lambda来决定根据图像大小动态应用哪些样式 - 图像大小本身可以从排队等待处理的图像中确定。
has_attached_file :image,
styles: lambda { |attachment| attachment.instance.decide_styles }
def decide_styles
unless @styles
@styles = {}
@styles[:preview] = { preview: {
geometry: "150x150",
format: :jpg,
convert_options: "-quality 85 -strip" }}
dimensions = Paperclip::Geometry.from_file(image.queued_for_write[:original].path)
if dimensions.width > 1000 or dimensions.height > 1000
@styles[:sample] = { sample: {
geometry: "1000x1000>",
convert_options: "-quality 90" }}
end
end
@styles
end
当使用带有Paperclip的lambdas时,你需要注意一些问题...
您似乎不仅需要指定样式,还需要指定任何转换选项等以及样式。建议不要在单独的lambda中指定转换选项。
在我的情况下,使用带有Paperclip的lambdas就行不通,看起来其他一些人也遇到了这个问题 - decide_styles
方法被调用了大约7次,最后一次被调用在尝试确定维度时抛出异常的时间 - 这就是我分配给@styles
并测试是否已经定义的原因(它不是很漂亮,但它有效!)。