我在rails 4应用程序中使用带有s3的paperclip。它在任何地方都运行良好,但我有一个特定的用例,需要一些特殊的行为。
我需要将图片上传为头像,并将其调整为所有缩略图尺寸,但之后我需要能够仅更新原始图像,同时保留所有缩略图链接
目前,我使用Proc来根据类变量确定附件大小。这导致image 1
上传并调整大小,然后我设置image 2
没有样式。我希望这会创造所有的拇指,然后取代原来的。不幸的是,它正在更新每个大小的URL,但它们都是空的。
tl; dr - 我需要重新调整头像的大小,但我需要能够仅更新原始内容并将其余内容单独保留。
控制器
class StudentsController < ApplicationController
# POST /students/:id/avatar
def new_avatar
current_student.avatar = params[:avatar]
current_student.set_orginial_only TRUE
current_student.avatar = params[:avatar_orig]
if current_student.save
render json: current_student, serializer: StudentAvatarSerializer, status: 200
else
render json: ErrorSerializer.new(current_student), status: 400
end
end
# DELETE /students/:id/avatar
def destroy_avatar
current_student.avatar.destroy
if current_student.save
render json: {success: true}, status: 200
else
render json: ErrorSerializer.new(current_student), status: 400
end
end
private
# find student by id and cache
def current_student
@student ||= Student.find(params[:id])
end
end
模型
class Student < ActiveRecord::Base
@@orginial_only = FALSE
def set_orginial_only value
@@orginial_only = value
end
# Paperclip attachements
has_attached_file :avatar, :styles => Proc.new { |clip| clip.instance.attachment_sizes },
path: "/:class/:attachment/:id/:content_type_extension/:style/:filename",
:default_url => "/images/:style/missing.png"
validates_attachment_content_type :avatar, :content_type => /image/
validates_attachment_size :avatar, :in => 0..2.megabytes
def attachment_sizes
if @@orginial_only
styles = {}
else
styles = {
tiny: '50x50#',
tiny_retina: '100x100#',
small: '60x60#',
small_retina: '120x120#',
medium: '108x108#',
medium_retina: '216x216#',
large: '205x205#',
large_retina: '410x410#'
}
end
styles
end
end
有没有办法在保留所有拇指的同时更新原始图像?
答案 0 :(得分:0)
解决方案:我最终只使用回形针来调整图像大小,而aws-sdk则手动替换回形针分配路径中的原始图像。