裁剪图像后,S3 不会存储所有图像尺寸
Posted
技术标签:
【中文标题】裁剪图像后,S3 不会存储所有图像尺寸【英文标题】:after cropping image, S3 doesn't store all image sizes 【发布时间】:2011-07-27 16:30:40 【问题描述】:我使用回形针 + S3 存储图像
has_attached_file :image,
:whiny => false,
:styles => :large => "550x340>",
:medium => "165x165>",
:small => "100x100>",
:thumbnail => "55x55>",
:processors => [:cropper],
:storage => :s3,
:s3_credentials => "#RAILS_ROOT/config/s3.yml",
:path => "/:id/:style",
:bucket => "XXX"
当我用图像创建一个对象时,一切都很好(我的 S3 存储桶中存储了 4 个不同大小的图像的 4 个副本)
当我使用 JCrop 裁剪图像时出现问题,S3 存储 4 个副本,但裁剪后的图像尺寸相同实际上是大尺寸。
我的控制器.rb:
def update
@deal = Deal.find(params[:id])
respond_to do |format|
if @deal.update_attributes(params[:deal])
format.html redirect_to(@deal, :notice => 'Deal was successfully updated.')
format.xml head :ok
else
format.html render :action => "edit"
format.xml render :xml => @deal.errors, :status => :unprocessable_entity
end
end
【问题讨论】:
您是否使用 CDN 来提供文件?如果是,则图像缓存在边缘位置。一种方法是要求 CDN 从缓存中删除图像,但这需要花钱,所以用新名称保存裁剪后的文件。 我不明白为什么缓存会导致我的问题? 【参考方案1】:这就是它的工作原理:
您将文件保存到 amazon s3 您通过 CDN 请求文件 如果文件可用,CDN 会检查其缓存 如果不可用,则从 s3 请求文件,缓存并提供服务 如果可用,则从缓存中提供服务。此步骤可确保您的用户获得最佳体验。如果 CDN 每次都从 s3 获取文件,那么这将比用户直接从 s3 获取文件花费的时间更长,这将违背 CDN 的目的。 您裁剪图像并将修改后的文件保存到 s3 您请求 CDN 文件,期望它会为您提供裁剪后的文件 CDN 检查其缓存中的文件,找到它并从缓存中提供文件。如果文件被修改,它不会再次询问 s3现在,我能想到的最佳方式是上传带有新文件名的裁剪图像。因此,当 CDN 检查其缓存时,它不会在那里找到它并要求 s3 获取该文件。您可以使用delayed_job 或resque 在后台删除旧文件。
希望,它澄清了一些事情。
【讨论】:
很好的解释谢谢。但让我澄清一下我的问题:裁剪后的图像有 4 个大小相同的版本,而不是原始版本。在这种情况下,缓存仍然是问题? 如果我理解正确,如果您将图像直接保存到对象,一切都会很好,但如果您在保存之前使用 jcrop 裁剪图像,在 新对象 中,你得到所有相同尺寸的款式?是这样吗?如果是,那么可能缓存在这里不起作用,我不知道出了什么问题。 nop 我已经有一个对象,当我用裁剪图像更新它时,我得到了一个尺寸而不是 4 个尺寸的裁剪图像。 这也没有意义,您是否尝试将裁剪后的图像上传到新对象中而不是更新现有对象。没有使用回形针,我使用载波。如果是 CW,我建议将调试代码放在回调中以找到问题的根源。以上是关于裁剪图像后,S3 不会存储所有图像尺寸的主要内容,如果未能解决你的问题,请参考以下文章