使用DelayedJobActiveRecord将图像上传到s3

时间:2014-05-24 11:30:19

标签: ruby-on-rails ruby-on-rails-4 amazon-s3 delayed-job

我正在尝试使用DelayedJobActiveRecord上传图片。但是当我尝试在DelayedJob中添加它时如下

AmazonService.delay.amazon_s3_store_image(image.last["image"], key)

###image.last["image"]

#<ActionDispatch::Http::UploadedFile:0x00000004c0ff40
 @content_type="image/jpeg",
 @headers=
  "Content-Disposition: form-data; name=\"post[images_attributes][0][image]\"; filename=\"GALAXY_SIII_mini_Product_Image4.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @original_filename="GALAXY_SIII_mini_Product_Image4.jpg",
 @tempfile=#<File:/tmp/RackMultipart20140524-3636-3bt3se>>

### key

"e6368079c2c6cdb4dbdaf6e5c03f2f"

def amazon_s3_store_image(image, key)
  BUCKET.objects[key].write(image, acl: :public_read)
  url = BUCKET.objects[key].public_url(secure: false)
  url.scheme + "://" + url.host + url.path
end

完全错误消息

NoMethodError: undefined method `name' for nil:NilClass
from /home/awais/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/psych/visitors/yaml_tree.rb:70:in `block in initialize'

我知道如何使用sidekiq,但不幸的是我的内存问题较少,因此我想使用DelayedJob来做这件事。

由于

1 个答案:

答案 0 :(得分:0)

在将延迟作业排入队列时,gem必须将执行操作所需的所有数据序列化到数据库中。所以,通常你不想序列化,例如整个对象(例如用户或其他对象),因为用户的所有属性都被序列化到数据库中 - 这是额外的工作,并且可能在作业运行时提供过时的数据!但是,在您的情况下,听起来好像您要求延迟作业尝试将图像文件序列化到数据库中!这听起来像是失败了。 (尝试在调试器中运行image.last["image"].to_yaml,看看你得到了什么!)

因此,为了让它在延迟作业中工作,您可能需要创建一个custom Delayed Job,它引用先前存储在文件系统上的临时位置的图像或类似的东西。这当然是额外的工作......但我认为没有办法解决这个问题。我不得不做过去将生成的PDF上传到AWS的事情。

注意:当您暂时将图像存储到文件系统时,还有一个令人头疼的问题,那么稍后再运行延迟的作业...图像必须存储在同一文件系统上延迟工作运行的那个或者找不到它!