`
cjyzpcl
  • 浏览: 33725 次
  • 性别: Icon_minigender_1
  • 来自: Charlotte
社区版块
存档分类
最新评论

关于整合File_Column和Rmagick上传图片的补遗

阅读更多

请看官先看此文:http://airport.iteye.com/blog/33216

文章最后会有引用文的详细内容!

假设如下场景,一个用户有一个logo图片,支持上传logo图片功能。这里对显示图片和用户图片关系进行下整合。

entry DDL:

sql 代码
  1. CREATE TABLE `entries` (   
  2.   `id` int(11) NOT NULL auto_increment,   
  3.   `image` varchar(255) NOT NULL,   
  4.   `photoable_id` int(11) NOT NULL,   
  5.   `photoable_type` varchar(100) NOT NULL,   
  6.   PRIMARY KEY  (`id`)   
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

 

user.rb:

ruby 代码
  1. class User < ActiveRecord::Base   
  2.   has_many :entries:as => :photoable  
  3.      
  4.   def logo_url   
  5.     url = "/images/users/default_logo.gif"  
  6.       if self != nil and self.logo == 1   
  7.       entry = Entry.find(:first, :conditions => "photoable_id = #{self.id}", :order => "uploaded_time desc")  
  8.       relative_path = entry.send("image_relative_path", 'thumb')   
  9.       return nil unless relative_path   
  10.       url = "/entry/image/"  
  11.       url << relative_path   
  12.     end  
  13.     url   
  14.   end  
  15.   
  16. end  

 注意其中的logo_url方法,这个方法参考了file_column中的相关代码直接对图片地址进行了包装。

entry.rb

ruby 代码
  1. class Entry < ActiveRecord::Base      
  2.   belongs_to :photoable:polymorphic => true  
  3.   
  4.   validates_format_of :image,      
  5.     :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,      
  6.     :message => "你只能上传JPG或则GIF的图片文件"  
  7.        
  8.   file_column :image:magick => {       
  9.           :versions => { "thumb" => "80x80" }      
  10.         }      
  11. end  

 

上述代码实现了user和entry的一对多关系,并且实现了多态。这里需要注意的是logo_url方法,此方法修改了File_Column自带的FileColumnHelper::url_for_file_column方法,原方法只能在ActionView中使用,并且需要一个ActionController中的对象,有些时候不是很方便使用。

感谢原文作者提供的帮助!

 

还有一个需要注意的是,中文文件名上传名称变为"__"的问题,

秦朝古月 给出了解决方案:

file_column上传中文文件名的文件时,汉字变成“_”的解决办法
编辑file_column.rb文件
把方法 self.sanitize_filename(filename)中的
filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"_")
给注释掉。

 

原文引用:

在网站制作过程中,图片上传以及图片的大小调整是经常会用到的一个功能!

Rails结合几个plug-in可以说很智能的做到了这一点

做了一个简单的例子,系统在Windows平台上运行

1.上网下载file-column-0.3.1.tar.gz 和rmagick-win32-1.13.0_IM-6.2.9-3.zip (我当前的最新版本,到下述站点下载 http://rubyforge.org/projects/rmagick/ Linux下版本是RMagick-1.14.1.tar.gz)

2.安装rmagick,执行zip包里面的exe文件,同时把安装路径放到path环境变量里面去,否则可能会报CORE_RL_magick_.dll找不到的错误

3.安装file-column到app的vendor目录里,直接copy过去就行

 

引用
以下的文件配置基本上按照官方提供的sample来进行,算是用中文整合一下,谈不上原创


4.建立一个存放路径的model,在数据库中建立Entry数据库
并生成相应的scaffold:
ruby script/generate scaffold Entry upload

 

4.修改model,并限制只能图片上传

代码
  1. class Entry < ActiveRecord::Base   
  2.   validates_format_of :image,   
  3.     :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,   
  4.     :message => "你只能上传JPG或则GIF的图片文件"  
  5.   file_column :image, :magick => {    
  6.           :versions => { "thumb" => "50x50""medium" => "640x480>" }   
  7.         }   
  8. end  

<script>render_code();</script>

 

5.修改_form.rhtml

代码
  1. <%= error_messages_for 'entry' %>  
  2.   
  3. <!---->  
  4. <p><label for="entry_image">Imagelabel><br/>  
  5. <%= file_column_field 'entry', 'image'  %>p>  
  6. <!---->  

<script>render_code();</script>

 

6.修改new.rhtml

代码
  1. <h1>New entryh1>  
  2.   
  3. <%= start_form_tag 'create',:multipart => true%>  
  4.   <%= render :partial => 'form' %>  
  5.   <%= submit_tag "Create" %>  
  6. <%= end_form_tag %>  
  7.   
  8. <%= link_to 'Back', :action => 'list' %>  

<script>render_code();</script>

 

7.修改show.rhtml

代码
  1. <% for column in Entry.content_columns %>  
  2. <p>  
  3.   <b><%= column.human_name %>:b> <%=h @entry.send(column.name) %>  
  4.   <br>  
  5.   原始大小:   
  6.   <%= image_tag url_for_file_column 'entry', 'image' %>  
  7.   <br>  
  8.   thumb:   
  9.   <%= image_tag url_for_file_column 'entry', 'image' ,'thumb'%>  
  10.   <br>  
  11.   medium:   
  12.   <%= image_tag url_for_file_column 'entry', 'image' ,'medium'%>  
  13. p>  
  14. <% end %>  
  15.   
  16. <%= link_to 'Edit', :action => 'edit', :id => @entry %> |   
  17. <%= link_to 'Back', :action => 'list' %>  

<script>render_code();</script>

 

分享到:
评论
2 楼 holin 2007-08-16  
<br/>
<strong>cjyzpcl 写道:</strong><br/>
<div class='quote_div'><br/>
<p>还有一个需要注意的是,中文文件名上传名称变为"__"的问题,</p>
<p><a href='http://ilgnep.iteye.com/'>秦朝古月</a> 给出了解决方案:</p>
<p>file_column上传中文文件名的文件时,汉字变成“_”的解决办法 <br/>
编辑file_column.rb文件 <br/>
把方法 self.sanitize_filename(filename)中的 <br/>
filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"_") <br/>
给注释掉。</p>
<br/>
<p>那样有一些文件名还是会有问题,我刚才测试的带()的文件名就报错。
</p><p>我现在改成</p>
<p>
</p><div class='code_title'>ruby 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-rb' start='1'>
    <li class='alt'><span><span>filename = </span><span class='builtin'>File</span><span>.basename(filename.gsub(</span><span class='string'>"\\", "</span><span>/</span><span class='string'>")) # work-around for IE</span> </span></li>
    <li class=''><span><span class='string'>    #filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"</span><span>_</span><span class='string'>")</span> </span></li>
    <li class='alt'><span><span class='string'>    #filename = "</span><span>_#{filename}</span><span class='string'>" if filename =~ /^\.+$/</span> </span></li>
    <li class=''><span><span class='string'>    require "</span><span>erb</span><span class='string'>"</span> </span></li>
    <li class='alt'><span><span class='string'>    filename = ERB::Util.url_encode(filename)</span> </span></li>
    <li class=''><span><span class='string'>    filename = "</span><span>unnamed" </span><span class='keyword'>if</span><span> filename.size == 0  </span></span></li>
    <li class='alt'><span>    filename  </span></li>
</ol>
</div>
<br/>
<p/>
页面上用URI.unescape解码。
<p/></div>
<br/>
1 楼 cjyzpcl 2007-07-20  
文件名大写问题参照原文作者的方案。
中文问题暂时没有解决。

相关推荐

    rmagick-2.3.0-x86-mswin32.gem

    rmagick-2.3.0-x86-mswin32.gem 用于图片验证码

    rmagick-2.16.0.gem

    安装redmine-3.2.3 ruby on rails 下的插件 rmagick 2.16.0 gem

    rmagick-2.10.0.gem

    rails 插件rmagick 2.10.0 gem

    RMagick-2.12.0-ImageMagick-6.5.6-8-Q8.rar

    RMagick-2.12.0-ImageMagick-6.5.6-8-Q8.rar 包含 rmagick-2.13.2.gem ImageMagick-6.5.6-8-Q8-windows-dll.exe RMagick-2.12.0.tar.gz rmagick-2.12.0-x86-mswin32.gem

    px4test:连续交付的测试脚本

    Hans-CI用于嵌入式硬件上的持续集成官方网站: : 用户数先决条件通过软件包管理器安装操作系统依赖项:苹果系统brew install opencv imagemagick ninjasudo gem install specific_install和RMagick: sudo gem ...

    rails上传图片代码实例

    今天讲解一下rails的图片上传,就是最平常的上传图片 这里的rails版本2.3.5 首先新建一个write_pic model内容如下: 代码如下:class WritePicrequire “RMagick”require “uuid”def self.write(pic_data,ori_name,...

    rmagick:ImageMagick的Ruby绑定

    马吉克目录介绍RMagick是Ruby编程语言和ImageMagick图像处理库之间的接口。先决条件最新版本的RMagick需要具备这些先决条件。 操作系统Linux * BSD 苹果系统视窗其他* nix类系统Ruby2.3版或更高版本。 您可以从获得...

    hornetseye-rmagick:WaSP眼的 RMagick 集成

    hornetseye-rmagick 作者: Jan Wedekind版权所有: 2010许可证: GPL 概要 这个 Ruby 扩展实现了必要的转换,以保存和加载存储在 {Hornetseye::MultiArray} 中的图像。 安装 hornetseye-rmagick使用RMagick Ruby 扩展...

    rmagick-2.13.1-x86-mingw32.gem

    redmine的一个包文件,可以用来导出为pdf,图像的功能

    xkcdize:Ruby 和 RMagick 中类似 XKCD 的图片失真

    这是一个用于Ruby和图像的小型实验脚本。 它只需要一些图像并转换成“ -like”(手写效果)。 前: 后: 剧本背后的故事很简单。 我刚刚阅读了 Wolfram 人 Vitaliy Kaurov 的一篇出色的博客,他解释说,如何在 ...

    drosterize:使用Ruby和RMagick自复制图像

    这里有一些例子,后面是算法描述和对实现的一些反思。 来源: ([图片来源]( )) 最简单的自我复制(ltrb是Tardis门上白板的左上右下): ./bin/drosterize -f examples/tardis.jpg -l 409 -t 439 -r 635 -b ...

    minimagick:RMagick的迷你替代品

    使用MiniMagick,ruby进程的内存仍然很小(它生成了ImageMagick的命令行程序mogrify,该程序也占用了一些内存,但是比RMagick小得多)。 请参阅正在 以下。 MiniMagick使您可以访问ImageMagick拥有的所有命令行...

    easy_captcha:验证码插件(Rails)

    基于rmagick的rails 3的简单验证码实现 经过Rails 3.2.8的测试 安装 添加到Gemfile gem 'easy_captcha' gem 'rmagick' 对于Java,您可以使用 gem 'rmagick4j' 捆绑执行后 rails g easy_captcha: install 配置 ...

    CentOS下安装配置最新redmine2.3

    CentOS下安装配置最新redmine2.3 包含整合apache 安装rmagick

    Ruby-Ruby绑定ImageMagick

    RMagick是Ruby和ImageMagick之间的接口

    chunky_png:在纯Ruby中对PNG图像的读写访问

    矮胖PNG 该库可以读取和写入PNG文件。 它是用纯Ruby编写的,以实现最大的可移植性。 我再说一遍:它不需要RMagick或任何其他内存泄漏图像库。特征解码PNG标准允许的任何图像。 这包括所有标准颜色模式,所有位深度,...

    colorama:一种从图像中提取最流行的颜色的宝石

    科罗拉多州Colorama是一种用于从图像中提取最主要和最突出颜色的宝石。要求该Gem使用RMagick ,因此必须安装ImageMagick库。安装将此行添加到您的应用程序的Gemfile中: gem 'colorama' 然后执行: $ bundle install...

    Colorama是一种用于从图像中提取最主要和最突出颜色的宝石。-Ruby开发

    Colorama是一种用于从图像中提取最主要和最突出颜色的宝石。 Colorama Colorama是一种用于从图像中提取最主要和最突出颜色的宝石。 要求此Gem使用RMagick,因此必须安装ImageMagick库。 安装将此行添加到应用程序的...

    rucaptcha:用于Rails应用程序的Captcha gem。 没有依赖关系。 没有ImageMagick,没有RMagick

    RuCaptcha 这是Rails应用程序的Captcha宝石,它通过C代码生成验证码图像。 注意:根据Ruby China的使用,验证码看起来被OCR解析的可能性低于5%... 没有RMagick; 用于Rails应用; 简单,易用; 高性能。 用法 将

    jekyll-gallery-generator, 从目录中生成照片库的osm插件.zip

    jekyll-gallery-generator, 从目录中生成照片库的osm插件 库生成器这是一个 Jekyll插件插件,它从目录满的图片生成库。 它使用 RMagick 创建缩略图。这个插件很简单。 它生成无分页。无子库和无描述的库。 查看我的...

Global site tag (gtag.js) - Google Analytics