Arduino中国 | Flamingo EDA

Mar/07

11

用FileColumn实现图片上传

在RoR应用中可以使用FileColumnRMagick来实现带有缩略图功能的图片上传功能。
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"%&gtImage</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

使用新浪微博登录

<<

>>

Theme Design by devolux.nh2.me