2011-06-09 4 views
5

से कम आकार का आकार है, मैं अपनी पुरानी साइट से कुछ आइकन आयात करना चाहता हूं। उन आइकनों का आकार 10kb से कम है। तो जब मैं आइकन को आयात करने की कोशिश कर रहा हूं तो इसकी वापसी stringio.txt फ़ाइल।ओपन यूआरआई और पेपरक्लिप का उपयोग करके छवि संग्रह करना 10kb

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 

रेक कार्य में।

category = Category.new 
    category.icon_from_url "https://xyz.com/images/dog.png" 
    category.save 
+0

आप किसी अन्य साइट से छवियों को पुनः प्राप्त करने,, हाँ कोशिश कर रहे हैं समस्या के कुछ प्रकार हो रही है? तब पेपरक्लिप सामान क्यों? आप सिर्फ आइकन डाउनलोड क्यों नहीं करते हैं और उन्हें अलग से अपलोड करते हैं? आपको एहसास है कि फ़ाइल अपलोड को संभालने के लिए पेपरक्लिप, है ना? – coreyward

+0

मैं पेपरक्लिप शैली में आइकन जोड़ना चाहता हूं। मेरे पास 400 फ़ोल्डर हैं जो मेरे लिए कई फ़ोल्डर्स बनाने के लिए संभव नहीं हैं। –

+0

इन आइकनों पर @coreyward अधिक कुछ श्रेणी से संबंधित हैं और प्रत्येक श्रेणी में कई अन्य विवरण हैं। –

उत्तर

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 
+0

यह कोड पहली छवि के लिए काम किया लेकिन फिर कुछ भी नहीं। मेरे पास 350 छवियों का एक लूप है। मैंने लिंक की दोबारा जांच की। यह बिल्कुल ठीक है। इसके अलावा छवि का नाम वही नहीं है। –

+0

@ मोहित क्या आप इस विधि को करने के बाद अपने मॉडल पर 'सेव' कॉल कर रहे हैं? –

+3

ओपन-यूरी द्वारा लौटाए गए आईओ पर 'original_filename' सेट करना बहुत आसान और तेज़ है। –

1

आप लगभग सोचते हैं, पार्स यूरी खोलने का प्रयास करें, स्ट्रिंग नहीं।

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(URI.parse(url)) 
    end  
end 

बेशक इस त्रुटियों

प्रबंधन नहीं करती है
+0

यह extenstion को बचाने के लिए नहीं जा रहा है! –

9

(एक "नकली फाइल अपलोड" पेपरक्लिप में के डिफ़ॉल्ट फ़ाइल नाम को ओवरराइड करने के छोटे फ़ाइलों या लगभग एक पर stringio.txt बड़ी फ़ाइलों पर यादृच्छिक अस्थायी नाम) आपके पास 2 मुख्य संभावनाएं हैं:

आईओ पर original_filename परिभाषित करें:

def icon_from_url(url) 
    io = open(url) 
    io.original_filename = "foo.png" 
    self.icon = io 
end 

तुम भी URI से फ़ाइल नाम प्राप्त कर सकते हैं:

io.original_filename = File.basename(URI.parse(url).path) 

या अपने :path में :basename बदल देते हैं:

has_attached_file :icon, :path => ":rails_root/public/:attachment/:id/:style/foo.png", :url => "/:attachment/:id/:style/foo.png" 

alway को :url बदल जब आप :path बदल याद रखें, अन्यथा icon.url विधि गलत होगी।

आप अपने custom interpolations (उदा। :rails_root/public/:whatever) को भी परिभाषित कर सकते हैं।

+3

मैं इसका उपयोग करने की कोशिश कर रहा हूं लेकिन अगर मैं इस उदाहरण में मूल_फिल्लेनाम को io पर सेट करने का प्रयास करता हूं तो मुझे मिल रहा है एक NoMethodError: अपरिभाषित विधि 'original_filename = ' tempfile पर त्रुटि। रूबी 1.8.7 रेल 2.3.8 –

+4

@ डस्टिनएम। यह काम करता है: 'def io.original_filename; "Foo.png"; अंत –

+0

मैं पुष्टि कर सकता हूं कि यह काम करता है। स्थानीय चर का उपयोग करने के लिए, मुझे define_method का उपयोग करना पड़ा: खुला (doc.url) do | file | file.singleton_class.instance_eval do define_method (: original_filename) {doc.title} अंत अंत –

-2

अतीत में, मुझे कमांड लाइन उपकरण "wget" का उपयोग करके दूरस्थ फ़ाइलों को पुनर्प्राप्त करने का सबसे विश्वसनीय तरीका मिला। निम्नलिखित कोड ज्यादातर एक मौजूदा उत्पादन से सीधे कॉपी किया जाता है कुछ बदलाव के साथ एप्लिकेशन (2.x रेल) ​​अपने कोड उदाहरण के साथ फिट करने के लिए:

[ 
    ['Cat', 'cat'], 
    ['Dog', 'dog'], 
].each do |name, icon| 
    CategoryIconImporter.import_from_url {:name => name}, "https://xyz.com/images/#{icon}.png" 
end 
:

class CategoryIconImporter 
    def self.download_to_tempfile (url) 
    system(wget_download_command_for(url)) 
    @@tempfile.path 
    end 

    def self.clear_tempfile 
    @@tempfile.delete if @@tempfile && @@tempfile.path && File.exist?(@@tempfile.path) 
    @@tempfile = nil 
    end 

    def self.set_wget 
    # used for retrieval in NrlImage (and in future from other sies?) 
    if [email protected]@wget 
     stdin, stdout, stderr = Open3.popen3('which wget') 
     @@wget = stdout.gets 
     @@wget ||= '/usr/local/bin/wget' 
     @@wget.strip! 
    end 
    end 
    def self.wget_download_command_for (url) 
    set_wget 
    @@tempfile = Tempfile.new url.sub(/\?.+$/, '').split(/[\/\\]/).last 
    command = [ @@wget ] 
    command << '-q' 
    if url =~ /^https/ 
     command << '--secure-protocol=auto' 
     command << '--no-check-certificate' 
    end 
    command << '-O' 
    command << @@tempfile.path 
    command << url 
    command.join(' ') 
    end 

    def self.import_from_url (category_params, url) 
    clear_tempfile 

    filename = url.sub(/\?.+$/, '').split(/[\/\\]/).last 
    found = MIME::Types.type_for(filename) 
    content_type = !found.empty? ? found.first.content_type : nil 

    download_to_tempfile url 

    nicer_path = RAILS_ROOT + '/tmp/' + filename 
    File.copy @@tempfile.path, nicer_path 

    Category.create(category_params.merge({:icon => ActionController::TestUploadedFile.new(nicer_path, content_type, true)})) 
    end 
end 

रेक कार्य तर्क कैसा लग सकता है

यह सामग्री प्रकार खोज के लिए माइम-प्रकार मणि का उपयोग करता है:

gem 'mime-types', :require => 'mime/types' 
संबंधित मुद्दे