2009-11-03 14 views
31

मेरे पास एक त्वरित प्रश्न था। क्या वास्तव में इसे किसी फ़ॉर्म के माध्यम से अपलोड किए बिना फ़ाइल को सहेजना संभव है?अपलोड किए बिना पेपरक्लिप का उपयोग कर फ़ाइलों को सहेजना

उदाहरण के लिए, मान लीजिए कि मैं ईमेल से संलग्नक में देख रहा हूँ, और मैं एक पेपर क्लिप का उपयोग कर उन्हें सहेजना चाहते हैं। मैं यह कैसे करु? क्या मुझे मैन्युअल रूप से save_file (या कुछ समान) कॉल करना है?

किसी भी मदद की बहुत सराहना की जाएगी!

उत्तर

46

मेरे पास एक रेक कार्य है जो सीधे निर्देशिका से छवियों (क्लाइंट लोगो) को पार्परक्लिप पर लोड करता है। आप शायद इसे अपनी जरूरतों के अनुसार अनुकूलित कर सकते हैं।

यह मेरा सरलीकृत क्लाइंट मॉडल है:

class Client < ActiveRecord::Base 
    LOGO_STYLES = { 
    :original => ['1024x768>', :jpg], 
    :medium => ['256x192#', :jpg], 
    :small => ['128x96#', :jpg] 
    } 

    has_attached_file :logo, 
    :styles => Client::LOGO_STYLES, 
    :url => "/clients/logo/:id.jpg?style=:style" 
    attr_protected :logo_file_name, :logo_content_type, :logo_size 
मेरी रेक काम पर

तो मैं ऐसा करते हैं:

# the logos are in a folder with path logos_dir 
Dir.glob(File.join(logos_dir,'*')).each do |logo_path| 
    if File.basename(logo_path)[0]!= '.' and !File.directory? logo_path 

    client_code = File.basename(logo_path, '.*') #filename without extension 
    client = Client.find_by_code(client_code) #you could use the ids, too 
    raise "could not find client for client_code #{client_code}" if client.nil? 

    File.open(logo_path) do |f| 
     client.logo = f # just assign the logo attribute to a file 
     client.save 
    end #file gets closed automatically here 
    end 
end 

सादर!

+4

फ़ाइल.न्यू (पथ) का उपयोग अवांछित स्थितियों की ओर जाता है। पेपरक्लिप फ़ाइल को बंद नहीं करता है। नया उदाहरण और इससे कई अनुलग्नकों को संसाधित करते समय "बहुत अधिक खुली फ़ाइलें" जैसी त्रुटियां हो सकती हैं। सही कोड 'f = File.new (logo_path) client.logo = f f.close' –

+2

बहुत अच्छी टिप्पणी होनी चाहिए। मैंने उस समस्या को नहीं मारा क्योंकि मैंने इसे बहुत कम फाइलों के साथ बहुत कम काम पर इस्तेमाल किया था। मैंने अपना समाधान अपडेट कर लिया है - मैं मैन्युअल रूप से बंद होने की बजाय फ़ाइल.ओपेन का उपयोग करना पसंद करता हूं। – kikito

11

फ़ाइल पेपरक्लिप में सहेजा एक फार्म के माध्यम से सीधे अपलोड करने की जरूरत नहीं है।

मैं एक परियोजना में पेपरक्लिप उपयोग कर रहा हूँ वेब क्रॉलर परिणामों से URL से फाइल को बचाने के लिए

। मुझे यकीन है कि कैसे आप ईमेल संलग्नक प्राप्त होता नहीं कर रहा हूँ (वे सर्वर स्थानीय फाइल सिस्टम पर हैं? अपने अनुप्रयोग जीमेल तरह एक ईमेल अनुप्रयोग है?) लेकिन जब तक आप एक फ़ाइल धारा (प्राप्त कर सकते हैं में open(URI.parse(crawl_result)) की तरह कुछ के माध्यम से मेरा मामला ...) आप उस फ़ाइल को अपने मॉडल फ़ील्ड में संलग्न कर सकते हैं जिसे has_attached_file चिह्नित किया गया है।

इस ब्लॉग पोस्ट के बारे में Easy Upload via URL with Paperclip मुझे यह पता लगा मदद की।

यह अब मूल ब्लॉग पोस्ट दिखाई देता है के बाद से अब उपलब्ध नहीं है - यहाँ यह का सार वेबैक मशीन से खींचा है:

यह उदाहरण एक फोटो मॉडल एक छवि अनुलग्नक है पता चलता है।

जिस तकनीक का हम उपयोग कर रहे हैं उसे आपके अनुलग्नक के लिए *_remote_url (स्ट्रिंग) कॉलम जोड़ने की आवश्यकता है, जिसका उपयोग मूल URL को संग्रहीत करने के लिए किया जाता है। इसलिए, इस मामले में, हमें फ़ोटो तालिका image_remote_url नामक कॉलम जोड़ने की आवश्यकता है।

# db/migrate/20081210200032_add_image_remote_url_to_photos.rb 

class AddImageRemoteUrlToPhotos < ActiveRecord::Migration 
    def self.up 
    add_column :photos, :image_remote_url, :string 
    end 

    def self.down 
    remove_column :photos, :image_remote_url 
    end 
end 

कुछ भी नहीं विशेष नियंत्रक के लिए आवश्यक है ...

# app/controllers/photos_controller.rb 

class PhotosController < ApplicationController 

    def create 
    @photo = Photo.new(params[:photo]) 
    if @photo.save 
     redirect_to photos_path 
    else 
     render :action => 'new' 
    end 
    end 

end 

रूप में, हम एक text_field :image_url कहा जाता है जोड़ने के लिए, ताकि लोगों को फ़ाइल अपलोड करें या एक URL प्रदान कर सकते हैं ...

# app/views/photos/new.html.erb 

<%= error_messages_for :photo %> 
<% form_for :photo, :html => { :multipart => true } do |f| %> 
    Upload a photo: <%= f.file_field :image %><br> 
    ...or provide a URL: <%= f.text_field :image_url %><br> 
    <%= f.submit 'Submit' %> 
<% end %> 

भावपूर्ण सामान फोटो मॉडल में है। हमें require open-uri की आवश्यकता है, attr_accessor :image_url जोड़ें, और सामान्य has_attached_file सामान जोड़ें। फिर, हम image_url विशेषता (यदि प्रदान किया गया है) में फ़ाइल डाउनलोड करने के लिए before_validation कॉलबैक जोड़ें और मूल URL को image_remote_url के रूप में सहेजें। अंत में, हम validates_presence_of :image_remote_url करते हैं, जो हमें फ़ाइल को डाउनलोड करने का प्रयास करते समय उठाए जा सकने वाले कई अपवादों से बचाव करने की अनुमति देता है।

# app/models/photo.rb 

require 'open-uri' 

class Photo < ActiveRecord::Base 

    attr_accessor :image_url 

    has_attached_file :image # etc... 

    before_validation :download_remote_image, :if => :image_url_provided? 

    validates_presence_of :image_remote_url, :if => :image_url_provided?, :message => 'is invalid or inaccessible' 

private 

    def image_url_provided? 
    !self.image_url.blank? 
    end 

    def download_remote_image 
    self.image = do_download_remote_image 
    self.image_remote_url = image_url 
    end 

    def do_download_remote_image 
    io = open(URI.parse(image_url)) 
    def io.original_filename; base_uri.path.split('/').last; end 
    io.original_filename.blank? ? nil : io 
    rescue # catch url errors with validations instead of exceptions (Errno::ENOENT, OpenURI::HTTPError, etc...) 
    end 

end 

सब कुछ सामान्य रूप में काम करेंगे आदि प्लस थंबनेल के निर्माण, सहित, क्योंकि हम मॉडल में कठिन सामान के सभी कर रहे हैं, "अपलोडिंग" यूआरएल के माध्यम से एक फ़ाइल स्क्रिप्ट/console में काम करता है साथ ही:

$ script/console 
Loading development environment (Rails 2.2.2) 
>> Photo.new(:image_url => 'http://www.google.com/intl/en_ALL/images/logo.gif') 
=> #<Photo image_file_name: "logo.gif", image_remote_url: "http://www.google.com/intl/en_ALL/images/logo.gif"> 
+0

मीठे! आपका बहुत बहुत धन्यवाद! –

+0

@Nate इस टिप्पणी के लिए धन्यवाद। ऐसा लगता है कि लिंक अब काम नहीं करता है? –

+0

यह बड़ी फ़ाइलों को डाउनलोड करने के लिए बहुत मेमोरी गहन है। दूसरा, एक स्ट्रिंगियो 10KB से कम फ़ाइलों के लिए वापस किया जाता है और यदि पेपरक्लिप सामग्री प्रकार सत्यापन करता है तो यह असफल हो जाएगा क्योंकि स्ट्रिंग्स में सामग्री प्रकार नहीं हैं। – maletor

संबंधित मुद्दे