使用大小小于10kb的开放URI和回形针存储图像

Moh*_*ain 5 ruby-on-rails image paperclip stringio

我想从旧网站导入一些图标.这些图标的大小小于10kb.因此,当我尝试将图标导入其返回的stringio.txt文件时.

require "open-uri"
class Category < ActiveRecord::Base
   has_attached_file :icon,  :path => ":rails_root/public/:attachment/:id/:style/:basename.:extension"
  def icon_from_url(url)
    self.icon = open(url)
   end    
end
Run Code Online (Sandbox Code Playgroud)

在rake任务中.

   category = Category.new
   category.icon_from_url "https://xyz.com/images/dog.png"
   category.save
Run Code Online (Sandbox Code Playgroud)

Kev*_*tre 35

尝试:

def icon_from_url(url)
  extname = File.extname(url)
  basename = File.basename(url, extname)

  file = Tempfile.new([basename, extname])
  file.binmode

  open(URI.parse(url)) do |data|  
    file.write data.read
  end

  file.rewind

  self.icon = file
end
Run Code Online (Sandbox Code Playgroud)

  • 在open-uri返回的IO上设置`original_filename`要简单得多,速度也快得多. (3认同)

Mic*_*ant 9

要覆盖Paperclip中的"假文件上载"的默认文件名(stringio.txt在小文件上或在较大文件上几乎随机的临时名称),您有两种主要可能性:

original_filename在IO上定义一个:

def icon_from_url(url)
  io = open(url)
  io.original_filename = "foo.png"
  self.icon = io
end
Run Code Online (Sandbox Code Playgroud)

您还可以从URI获取文件名:

io.original_filename = File.basename(URI.parse(url).path)
Run Code Online (Sandbox Code Playgroud)

或者替换:basename你的:path:

has_attached_file :icon, :path => ":rails_root/public/:attachment/:id/:style/foo.png", :url => "/:attachment/:id/:style/foo.png"
Run Code Online (Sandbox Code Playgroud)

记得总是改变:url你改变的时候:path,否则icon.url方法会出错.

您还可以定义自己的自定义插值(例如:rails_root/public/:whatever).

  • @DustinM.这有效:`def io.original_filename; "foo.png"; end` (4认同)
  • 我试图使用这个但是如果我在这个例子中尝试在io上设置original_filename我得到一个NoMethodError:未定义的方法`original_filename ='tempfile上的错误.Ruby 1.8.7 rails 2.3.8 (3认同)