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!

È stato utile?

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">
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top