在RoR应用中可以使用FileColumn和RMagick来实现带有缩略图功能的图片上传功能。
RMagick是对ImageMagick的Ruby封装,所有我们需要先安装最新版本的ImageMagic,此处用的是6.3.3:
# ./configure --prefix=/path/to/local/root/usr --without-perl
# make
# make install
接下来再通过gem安装RMagick:
# gem install rmagick
安装FileColumn也可以使用引入SVN外部资源的做法,即在RoR工程的根目录下执行下面的命令:
# svn propset svn:externals "file_column http://opensvn.csie.org/rails_file_column/plugins/file_column/tags/rel_0-3-1/" vendor/plugins
# svn update
假设我们的应用中有一个名为Book的对象,用户可以为每个Book对象上传一张图片。首先用scaffold创建相应的框架:
# ./script/generate scaffold Admin::Book
然后在app/models/book.rb中为模型对象加上file_column属性:
class Book < ActiveRecord::Base
file_column :image, :web_root => "upload/", :root_path => File.join(RAILS_ROOT, "public", "upload")
end
在与之对应的数据库表books中,要添加名为image的项,相应的MySQL语句为:
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` int NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`author` varchar(100) NOT NULL default '',
`publisher` varchar(100) NOT NULL default '',
`isbn` varchar(32) NOT NULL default '',
`description` varchar(255) default NULL,
`image` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
接着再在app/views/admin/books/_form.rhtml中用file_column_field为表单添加相应的项。
<label for="book_image"%>Image</label%>
<%= file_column_field 'book', 'public' %>
在创建表单的app/views/admin/books/new.rhtml中,要为其设置multipart属性:
<%= start_form_tag({:action => 'create'}, :multipart => true) %>
需要注意的是,下面这种写法是不可以的:
<%= start_form_tag :action => 'create', multipart => true %>
在需要显示图片的位置,如app/views/admin/books/show.rhtml里,只要加上如下的语句就可以了,其余的事情都交由FileColumn插件来完成:
<%= image_tag( url_for_file_column("book", "image") ) %>
实际使用的时候发现用FileColumn上传的图片其读写属性都是0600,这样启动HTTP服务的用户可能就无法访问该文件,最简单的解决办法是修改vendor/plugins/file-column/lib/file_column.rb中TempUploadedFile类的store_upload方法,在调用FileUtils.mv方法移动文件之前将其属性修改为0644:
FileUtils.chmod 0644, local_file_path
这也许不是最好的办法,比如考虑是否可以在environment.rb中用alias_method的办法重写相应的store_upload方法,类似于该文所采用的办法。
No tags
No comments yet.
Leave a Reply
<< Rails应用的中文化
