1

我有模型:

class RealtyPhoto < ActiveRecord::Base
  attr_accessible :name, :photo

  mount_uploader :photo, RealtyPhotoUploader

  belongs_to :realty_object
end

和上传者:

class RealtyPhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def default_url
    [version_name, "/assets/default-flat.jpg"].compact.join('_')
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

我在我的代码中写了这样的内容:

require 'open-uri'

object = RealtyObject.last

photo = RealtyPhoto.new

photo.photo = open('http://milushov.ru/bg.jpg').read

object.realty_photos << photo

我在那条线上得到一个错误:

 photo.photo = open('http://milushov.ru/bg.jpg').read
ArgumentError: string contains null byte
from /home/roma/.rvm/gems/ruby-1.9.3-p327@miel/gems/carrierwave-0.7.1/lib/carrierwave/sanitized_file.rb:113:in `expand_path'

有人知道如何从外部下载和保存文件吗?(当我从页面上的表单中保存文件时 - 一切正常)。也许使用 CarrierWave 上传器?

4

3 回答 3

3

Carrierwave 从远程 url 上传图像,remote_column_name_url在您的情况下 使用photo.remote_photo_url = "url"

于 2013-01-11T09:08:33.290 回答
2

您似乎忘记了关闭文件句柄。关闭文件可能会使您的应用程序正常工作。

于 2013-01-19T12:31:10.170 回答
1

你也可以用另一种方式来做。更有效的是 model[:name] = filename model.save surl = model.photo.url FileUtils.copy(filesrc,surl,derefrence=true)

这种方法基本上可以避免您将文件复制到一个位置,并且在保存时将其复制到另一个位置十

于 2013-01-19T12:44:39.710 回答