アップロードせずにペーパークリップを使用してファイルを保存します

StackOverflow https://stackoverflow.com/questions/1666753

  •  13-09-2019
  •  | 
  •  

質問

私は簡単な質問がありました。それは実際にフォームを通してそれをアップロードしなくても、ファイルを保存することは可能ですか?

たとえば、のは、私は電子メールから添付ファイルを見ている、と私はペーパークリップを使用してそれらを保存したいとしましょう。私はこれをどのように行うのですか?私は手動でどこかSAVE_FILE(または類似のもの)をコールする必要がありますか?

すべてのヘルプははるかに高く評価されるだろう!

役に立ちましたか?

解決

私はparperclipに直接ディレクトリから画像(クライアントのロゴ)をロードするrakeタスクを持っています。あなたはおそらく、あなたのニーズに適合させることができます。

これは私の単純化されたクライアントモデルです。

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

そして、私のrakeタスクに私はこれを行います

# 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

よろしく!

他のヒント

ペーパークリップに保存したファイルは、フォームから直接アップロードする必要はありません。

私は、ウェブクローラ結果からのURLからファイルを保存するためのプロジェクトにペーパークリップを使用しています。私は中open(URI.parse(crawl_result))のようなものを経由して(限り、あなたはファイルストリームを得ることができるよう、あなたが電子メールの添付ファイルを取得したいかどうかはわかりません(彼らは、サーバーのローカルファイルシステム上にある?あなたのアプリはGmailなどのメールアプリですか?)が、私の場合は...)あなたはhas_attached_fileをマークしていますあなたのモデルフィールドにそのファイルを添付することができます。

<ストライキ> 簡単アップロードについてこのブログ記事私はこれを理解助けのペーパークリップとURLを経由して。

今、元のブログ記事が利用できなくなって表示されませんので - ここでの要点は、ウェイバックマシンから引き出されます:

この例では、画像の添付ファイルを持っている写真のモデルを示しています。

私たちが使っている技術は、元のURLを格納するために使用され、あなたの添付ファイル、ため*_remote_url(文字列)列を追加する必要があります。したがって、この場合には、我々は、photos表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
人々は、ファイルをアップロードするか、URLを提供できるように、

の形式では、我々は、:image_urlと呼ばれるtext_fieldを追加...

# 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のものを行う必要があります。その後、我々は(提供された場合)before_validation属性にファイルをダウンロードし、image_urlとして、元の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

すべては、サムネイルの作成など、通常通りなどプラスに働くだろう、私たちはモデルでハードなもののすべてをやっているので、「アップロード」ファイルURLを経由して、同様のスクリプト/コンソール内から動作します

$ 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">
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top