Salvataggio di file utilizzando Paperclip senza caricare
-
13-09-2019 - |
Domanda
ho avuto una domanda veloce. E 'possibile salvare un file senza realmente caricarlo attraverso una forma?
Per esempio, diciamo che sto guardando gli allegati dai messaggi di posta elettronica, e voglio salvarli utilizzando una graffetta. Come faccio a fare questo? Devo manualmente per chiamare un SAVE_FILE (o qualcosa di simile) da qualche parte?
Qualsiasi aiuto sarebbe molto apprezzato!
Soluzione
Ho un compito rastrello che carica le immagini (loghi client) da una directory direttamente sul parperclip. Probabilmente si può adattarlo alle proprie esigenze.
Questo è il mio modello client semplificato:
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
Poi, il mio compito rake faccio questo:
# 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
Saluti!
Altri suggerimenti
Il file salvato in Paperclip non deve essere caricato direttamente tramite un modulo.
sto usando Paperclip in un progetto per salvare i file da URL dai risultati WebCrawler. Io non sono sicuro di come si otterrebbe allegati e-mail (sono sul file system locale del server? È la vostra applicazione un'applicazione di posta elettronica come Gmail?), Ma fino a quando si può ottenere un flusso di file (via qualcosa come open(URI.parse(crawl_result))
in il mio caso ...) è possibile allegare il file al vostro campo modello che contrassegnato has_attached_file
.
Questo post blog su Easy Upload via URL con il Paperclip mi ha aiutato a capire questo fuori.
Dal momento che ora sembra il post sul blog originale è non disponibile più - ecco l'essenza di esso tirato dalla macchina Wayback:
Questo esempio mostra un modello di foto che ha un allegato immagine.
La tecnica che stiamo usando richiede l'aggiunta di una colonna di *_remote_url
(stringa) per il vostro attaccamento, che viene utilizzata per memorizzare l'URL originale. Quindi, in questo caso, abbiamo bisogno di aggiungere una colonna denominata image_remote_url
la foto della tabella.
# 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
è richiesto Niente di speciale per il regolatore ...
# 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
Nella forma, aggiungiamo un text_field chiamato :image_url
, così la gente può caricare un file o un 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 %>
La roba carnosa è nel modello Foto. Abbiamo bisogno di require open-uri
, aggiungere un attr_accessor :image_url
, e fare le cose has_attached_file
normale. Poi, aggiungiamo un callback before_validation
per scaricare il file nell'attributo image_url
(se previsto) e salvare l'URL originale come image_remote_url
. Infine, facciamo un validates_presence_of :image_remote_url
, che ci permette di salvare dalle tante eccezioni che possono essere sollevate quando si tenta di scaricare il file.
# 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
Tutto funzionerà come normale, compresa la creazione di miniature, ecc Inoltre, dal momento che stiamo facendo tutte le cose difficili nel modello, "upload", un file tramite URL funziona dall'interno di script / console, così:
$ 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">