3

我正在开发一个 Rails 应用程序,用户将在其中上传大量图像。

我当前的设置:使用 SWFUpload 使用带有 S3 存储的 Paperclip 插件一次上传多个文件。原图上传到 S3 后,Delayed_Job 用于后期处理(缩略图等)。

我遇到的问题是图像上传速度很慢。我假设默认的回形针设置是图像将从用户到 -> 我的服务器到 -> s3。

我在想我可以将图像直接上传到 s3,但我不确定如何使用 Paperclip 和后期处理来实现它。我找不到任何处理此问题的插件或示例。

有人有建议吗?如果没有,你能指出我正确的方向吗?

提前致谢!

蒂姆

4

2 回答 2

3

我遇到过同样的问题几次。我解决它的方法是创建两个模型,一个Image模型和一个TempImage模型,它继承自Image模型。这要求您在桌子type上有一列Image。模型将TempImage图像保存在本地,然后当您Image直接从模型访问并重新保存它时,它将遵循Image模型中定义的任何内容,即 Amazon S3。

例子:

# Will save in the database as a TempImage inside the Image table
temp = TempImage.create(:asset => File.new('some_path', 'r'))

# When you find it again through the Image model, it bypasses the type column
# so next time you save it, it is saved as an Image.
amazon = Image.find(temp.id)
amazon.save!

这是我延迟的工作:

class MoveToS3Job < Struct.new(:temp_revision_id)
  def perform
    upload = Image.find(temp_revision_id)
    temp_path = File.expand_path("tmp/uploads/#{upload.asset_file_name}", Rails.root)
    upload.asset = File.new(temp_path, 'r')
    upload.save!

    if File.exists?(temp_path) && !File.directory?(temp_path)
      File.delete(temp_path)
    end
  rescue ActiveRecord::RecordNotFound
    # If the record wasn't found, do some sort of
    # error report, but don't keep it in the queue.
  end
end

这是TempImage模型:

class TempImage < Image
  has_attached_file :asset, {
    :path => ":rails_root/tmp/uploads/:basename_:updated_at.:extension"
  }
end

然后是原始Image模型:

class Image < ActiveRecord::Base
  # Validations
  validates :asset, :presence => true

  # Paperclip
  has_attached_file :asset, :styles => {
    :preview => ['100x100#', :png],
    :thumb => ['50x50#', :png]
  },
  :default_style => :thumb,
  :storage => :s3,
  :bucket => 'bucket-name',
  :s3_credentials => File.expand_path('config/s3.yml', Rails.root),
  :path => "photos/:id_partition/:style.:extension"
end

您的原始Image模型应始终包含您的后期处理,因为这将在后台完成。

您总是可以覆盖一些方法以使其更简洁,但这可以让您更好地了解它的工作原理以及您需要做什么,以便您可以让它按照您的意愿工作。

于 2010-09-07T22:05:17.470 回答
0

如果您最终选择了直接上传到 S3 的路线,从而从 Rails 服务器卸载工作,请查看我的示例项目:

使用 Rails 3、Flash 和基于 MooTools 的 FancyUploader 直接上传到 S3 的示例项目:https ://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

使用 Rails 3、Flash/Silverlight/GoogleGears/BrowserPlus 和基于 jQuery 的 Plupload 直接上传到 S3 的示例项目:https ://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

顺便说一句,您可以使用 Paperclip 进行后处理,使用类似这篇博文描述的内容:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

于 2011-05-27T16:23:23.863 回答