POST message有一种特殊的类型叫做:multipart/form-data,这是一种又一种特定的form产生的message,这种form是包含<input type="file"...>的form。在客户端<input type="file"...>标签显示成这样的形式:
为了说明问题,我们举例来看看,先建立数据库:
create table pictures (
id int not null auto_increment,
comment varchar(100),
name varchar(200),
content_type varchar(100),
data blob,
primary key (id)
);
建立controller:
class UploadController < ApplicationController
def get
@picture = Picture.new
end
end
建立get template:
<%= error_messages_for("picture") %>
<%= form_tag({:action => 'save'}, :multipart => true) %>
Comment: <%= text_field("picture", "comment") %>
<br/>
Upload your picture: <%= file_field("picture", "picture") %>
<br/>
<%= submit_tag("Upload file") %>
<%= end_form_tag %>
建立model:
class Picture < ActiveRecord::Base
validates_format_of :content_type, :with => /^image/,
:message => "--- you can only upload pictures"
def picture=(picture_field)
self.name = base_part_of(picture_field.original_filename)
self.content_type = picture_field.content_type.chomp
self.data = picture_field.read
end
def base_part_of(file_name)
name = File.basename(file_name)
name.gsub(/[^\w._-]/, '')
end
end
这里定义的 picture= method,会读取表单中 name=picture[picture] 的标签的数据,因为文件对象比较复杂,不能直接存到数据库中的某个列中,所以需要进行复杂的处理,html中文件对象的可以分为3个部分:
文件的名称 |
上传时候的文件名字 |
比如:1.gif |
文件的类型 |
上传的文件的类型 |
比如:image/gif |
文件的数据部分 |
文件的数据部分 |
|
上面的红色字体对应了处理文件对象的部分
扩充controller,添加save action:
def save
@picture = Picture.new(params[:picture])
if @picture.save
redirect_to(:action => 'show', :id => @picture.id)
else
render(:action => :get)
end
end
扩充controller,添加picture action:
def picture
@picture = Picture.find(params[:id])
send_data(@picture.data,
:filename => @picture.name,
:type => @picture.content_type,
:disposition => "inline")
end
注意send_data method 返回值被 url_for method接受,用于显示图片,我们这里要注意一下 :filename和:type这2个key,在用户使用右键---另存为 的时候,文件名和类型将被显示出来
定义show action:
def show
@picture = Picture.find(params[:id])
end
show template:
<h3><%= @picture.comment %></h3>
<img src="<%= url_for(:action => "picture", :id => @picture.id) %>"/>
这里使用url_for方法来显示图片
三。图片文件上传
假设如下场景,一个用户有一个logo图片,支持上传logo图片功能。这里对显示图片和用户图片关系进行下整合。
entry DDL:
sql 代码
- CREATE TABLE `entries` (
- `id` int(11) NOT NULL auto_increment,
- `image` varchar(255) NOT NULL,
- `photoable_id` int(11) NOT NULL,
- `photoable_type` varchar(100) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
user.rb:
ruby 代码
- class User < ActiveRecord::Base
- has_many :entries, :as => :photoable
-
- def logo_url
- url = "/images/users/default_logo.gif"
- if self != nil and self.logo == 1
- entry = Entry.find(:first, :conditions => "photoable_id = #{self.id}", :order => "uploaded_time desc")
- relative_path = entry.send("image_relative_path", 'thumb')
- return nil unless relative_path
- url = "/entry/image/"
- url << relative_path
- end
- url
- end
-
- end
注意其中的logo_url方法,这个方法参考了file_column中的相关代码直接对图片地址进行了包装。
entry.rb
ruby 代码
- class Entry < ActiveRecord::Base
- belongs_to :photoable, :polymorphic => true
-
- validates_format_of :image,
- :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,
- :message => "你只能上传JPG或则GIF的图片文件"
-
- file_column :image, :magick => {
- :versions => { "thumb" => "80x80" }
- }
- 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,并限制只能图片上传
代码
- class Entry < ActiveRecord::Base
- validates_format_of :image,
- :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,
- :message => "你只能上传JPG或则GIF的图片文件"
- file_column :image, :magick => {
- :versions => { "thumb" => "50x50", "medium" => "640x480>" }
- }
- end
<script>render_code();</script>
5.修改_form.rhtml
代码
- <%= error_messages_for 'entry' %>
-
-
- <p><label for="entry_image">Imagelabel><br/>
- <%= file_column_field 'entry', 'image' %>p>
-
<script>render_code();</script>
6.修改new.rhtml
代码
- <h1>New entryh1>
-
- <%= start_form_tag 'create',:multipart => true%>
- <%= render :partial => 'form' %>
- <%= submit_tag "Create" %>
- <%= end_form_tag %>
-
- <%= link_to 'Back', :action => 'list' %>
<script>render_code();</script>
7.修改show.rhtml
代码
- <% for column in Entry.content_columns %>
- <p>
- <b><%= column.human_name %>:b> <%=h @entry.send(column.name) %>
- <br>
- 原始大小:
- <%= image_tag url_for_file_column 'entry', 'image' %>
- <br>
- thumb:
- <%= image_tag url_for_file_column 'entry', 'image' ,'thumb'%>
- <br>
- medium:
- <%= image_tag url_for_file_column 'entry', 'image' ,'medium'%>
- p>
- <% end %>
-
- <%= link_to 'Edit', :action => 'edit', :id => @entry %> |
- <%= link_to 'Back', :action => 'list' %>
<script>render_code();</script>
相关推荐
在Rails框架中处理文件上传时,经常会遇到一个问题,那就是当用户尝试上传包含中文名称的文件时,文件名可能会出现乱码。这个问题主要是由于字符编码不兼容导致的。Rails默认使用UTF-8编码,但文件系统或者某些外部...
在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...
Rails 多文件上传插件实现详解 Rails 多文件上传插件是基于 Ruby on Rails 框架的一款插件,旨在实现多文件的同时上传,控制文件的格式、数量,并且兼容多种浏览器,包括 IE6、7、Firefox 等。下面是对插件的详细...
在Ruby on Rails框架中,...通过理解以上知识点,你将能够构建一个功能完善的Rails文件上传系统,确保用户能安全、便捷地上传和管理他们的文件。在实际项目中,还需要考虑性能优化、错误处理和用户体验等方面的问题。
在Ruby on Rails框架中,文件上传是一个常见的需求,特别是在应用的升级过程中,处理文件上传的策略可能会有所变化。Rails提供了多种处理文件上传的方法,包括直接存储到本地文件系统、使用云存储服务(如Amazon S3...
在Ruby on Rails(Rails)框架中,为文件上传添加进度条功能可以显著提升用户体验,让用户在上传大文件时能够清楚地看到进度,增加交互性。本文将深入探讨如何在Rails应用中实现这一功能。 首先,我们需要理解文件...
在Rails框架中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于创建动态和交互式的Web应用程序。AJAX允许页面在不刷新整个页面的情况下与服务器进行通信,从而提高用户体验。在本篇博文中,我们将...
jquery-fileupload-rails, 用于 Rails的jQuery文件上传集成 Rails 文件上传jQuery-File-Plugin 是一个文件上传插件,由的Tschan 。 jQuery文件上传功能多文件选择。drag&拖放支持。进度栏和jQuery预览图像。 支持...
在Rails中,最常用的文件上传库是Paperclip和CarrierWave,但现在更推荐使用ActiveStorage,这是Rails 5.2及更高版本内置的一个功能。ActiveStorage直接与数据库交互,方便管理和存储文件,同时支持通过第三方服务如...
这通常涉及将证书文件和私钥上传到服务器,并在Rails应用中配置它们。 7. **Heroku与SSL**:如果你的应用托管在Heroku上,可以通过Heroku的控制台或CLI轻松添加和管理SSL证书。 8. **HSTS...
10. **Gem包管理**:Ruby的Gem系统使得安装和管理第三方库变得简单,如Devise用于用户认证,Paperclip或Carrierwave处理文件上传,Bootstrap提供前端UI组件等。 学习Rails的过程中,实践尤为重要。通过完成实际项目...
用于RailsHTML5文件上传器这个gem使用来上传文件。安装在Gemfile中: gem 'rails-uploader'在航线上: mount Uploader :: Engine => '/uploader' 迁移ActiveRecord: $ bundle exec rails g uploader:install用法...
这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何利用Rails的强大功能来创建一个允许用户上传、分享和浏览图片的应用。 1. **Rails框架基础**: Rails的核心理念是DRY(Don't...
jack_up, 在 Rails 中,[DEPRECATED] 轻松AJAX文件上传 从October年8 月开始,已经不推荐使用 另外,对于其他的, 付费和免费的上传工具,JackUp已经被否决了。 JackUp简单AJAX文件在 Rails 中上传。安装修改你的...
在这个场景中,我们关注的是Rails的自动完成、文件上传、分页以及上传进度管理相关的插件。让我们详细了解一下这些关键知识点: 1. **Rails 自动完成**: 自动完成是一种功能,允许用户在输入框中键入时提供预填...
7. **Rails插件与Gem**:Rails社区提供了丰富的插件和Gem,如Devise用于身份验证,Paperclip或Carrierwave处理文件上传,Resque或Sidekiq实现后台任务队列。掌握如何选择和使用这些工具来扩展应用功能。 8. **Rails...
upload_url: "swfuploadfile.js", // 文件上传的后端处理路径 post_params: { "utf8": "✓", "authenticity_token": "<%= form_authenticity_token %>" }, // 上传请求携带的参数 file_size_limit: "100MB", ...