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