我有一个快速的问题。是否可以在不通过表单实际上传的情况下保存文件?
例如,假设我正在查看电子邮件中的附件,并且我想使用回形针保存它们。我该怎么做呢?我是否必须在某处手动调用 save_file(或类似的东西)?
任何帮助将非常感激!
我有一个快速的问题。是否可以在不通过表单实际上传的情况下保存文件?
例如,假设我正在查看电子邮件中的附件,并且我想使用回形针保存它们。我该怎么做呢?我是否必须在某处手动调用 save_file(或类似的东西)?
任何帮助将非常感激!
我有一个 rake 任务,可以将目录中的图像(客户端徽标)直接加载到 parperclip 上。您可能可以根据需要对其进行调整。
这是我的简化客户端模型:
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
问候!
Paperclip 中保存的文件不必直接通过表单上传。
我在一个项目中使用 Paperclip 来保存来自 webcrawler 结果的 URL 中的文件。我不确定您将如何获取电子邮件附件(它们是否在服务器的本地文件系统上?您的应用程序是像 GMail 这样的电子邮件应用程序吗?)但只要您可以获得文件流(通过类似open(URI.parse(crawl_result))
我的case...) 您可以将该文件附加到标记为 的模型字段中has_attached_file
。
这篇关于使用 Paperclip 通过 URL 轻松上传的博客文章帮助我解决了这个问题。
由于现在看来原始博客文章不再可用 - 这是从 Wayback 机器中提取的要点:
此示例显示具有图像附件的照片模型。
我们使用的技术需要*_remote_url
为您的附件添加一个(字符串)列,用于存储原始 URL。因此,在这种情况下,我们需要添加一个名为image_remote_url
photos 表的列。
# 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
事情。然后,我们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">