【问题标题】:Uploading a remote file url from Rails Console with Carrierwave使用 Carrierwave 从 Rails 控制台上传远程文件 url
【发布时间】:2013-05-30 21:26:47
【问题描述】:

我只是想知道如何在 Rails 控制台中使用 Carrierwave 上传远程文件 url。

我尝试了以下没有任何运气。我想它没有处理上传器?

user = User.first
user.remote_avatar_url = "http://www.image.com/file.jpg"
user.save

非常感谢

【问题讨论】:

  • 这是正确的语法。你的 development.log 说了什么?
  • 当然假设用户mounts_uploader :avatar
  • 感谢杰西的回复。我是用户 mount_uploader :avatar, AvatarUploader。我的日志实际上没有显示任何内容。我肯定错过了什么。通过浏览器可以正常工作。
  • 好的,它看起来现在可以工作了。我必须在我的 Vagrant VM 的 SSH 中运行它。

标签: ruby-on-rails ruby-on-rails-3.2 carrierwave


【解决方案1】:

查看此页面上的“从远程位置上传文件”部分https://github.com/carrierwaveuploader/carrierwave

如果位置的 url 无效,CarrierWave 应该抛出错误

2.1.3 :015 > image.remote_image_url = "http"
 => "http"
2.1.3 :016 > image.save!
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image trying to download a file which is not served over HTTP

或者如果是未知主机:

2.1.3 :017 > image.remote_image_url = "http://foobar"
=> "http://foobar"
2.1.3 :018 > image.save!
   (0.4ms)  BEGIN
   (0.4ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Image could not download file: getaddrinfo: nodename nor servname provided, or not known

另外请注意,如果你想下载远程图片,你应该在属性前面加上remote_,并在后面加上_url,如示例所示

【讨论】:

  • 我面临的问题是,在创建新条目并使用 image.remote_image_url = "somevalidurl" 保存远程 URL 时它工作正常,但在更新时它不会更新新图像。
【解决方案2】:
user = User.first
user.remote_avatar = File.open(FILE_LOCATION)
user.save

FILE_LOCATION 可以是

File.join(Rails.root, '/files/png-sample.png')

如果在 rails 项目的文件夹“files”中找到文件

【讨论】:

  • 问题是如何从远程位置(远程 URL)上传文件。不是我系统上的文件。
  • 如果是这样,那么只需使用方法user.remote_avatar_url = "www.example.com/image.jpg,Carrierwave 将简单地下载文件并添加重新上传到您的应用程序。
【解决方案3】:

我也遇到了同样的问题。问题可能是 http 正在重定向到 https。所以我用 gsub 替换了它们,如下所示:

image.remote_image_url = remote_image_url.gsub('http://','https://')
image.save!

这应该很可能解决问题。

【讨论】:

    【解决方案4】:

    工作如下:

    url='http://host.domain/file.jpg'    
    time=Time.now.to_i.to_s
    myfile=IO.sysopen("tmp/"+time+"_img."+url.split(".").last,"wb+")
    tmp_img=IO.new(myfile,"wb")
    tmp_img.write open(URI.encode(url)).read
    
    if File.exist?("tmp/"+time+"_img."+url.split(".").last)
      "tmp/"+time+"_img."+url.split(".").last
      image = ActionDispatch::Http::UploadedFile.new(:tempfile => tmp_img, :filename => File.basename(tmp_img))
    else 
      image=nil
    end
    @your_model.image=image
    @your_model.save
    

    【讨论】:

      【解决方案5】:

      我遇到了 remote_avatar_url 没有上传图片或抛出任何错误的问题。对我来说,据我所知,这是因为我在模型中设置了以下内容。

      attr_accessor :remote_avatar_url
      

      Carrierwave 会为您介绍这一点,虽然我不明白为什么,但您自己设置会搞砸。

      【讨论】:

      • 如果你这样做,本质上会覆盖carrierwave的remote_avatar_url声明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 2011-04-24
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多