`

Rails 2.3下可以用的上传文件

阅读更多


One of my project Lucas needs to enable users to upload pictures as their logos. How to get things done? In the book Agile Web Development with Rails, I’ve found a way.

All together, the code counts less than 50 lines.

Firstly we have to create a table to record the data. The columns should at least contain id, content-type and data, and the SQL maybe like follows:

    CREATE TABLE IF NOT EXISTS `logos` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `data` blob NOT NULL,
      `content_type` varchar(30) collate utf8_bin NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT;


OK. It’s time to start coding, and we have to create the model Logo and controller Logo.

    ruby script/generate model Logo
    ruby script/generate controller Logo get got show


In app/controllers/logo_controller.rb, there’re 3 actions. “get” will display a upload form, and “got” is the final page if upload succeeded, which show the picture by a tag. Of course, we use the “show” action to get data from the database and send to user.

Let’s start coding here:

app/models/logo.rb
    class Logo < ActiveRecord::Base
      validates_format_of :content_type , :with => /^image/, :message => "你只能上传图片"
     
      def uploaded_logo=(logo_field)
        self.content_type = logo_field.content_type.chomp
        self.data = logo_field.read
      end
    end


The function “uploaded_logo” contains a little bit magic. Continue to see the upload form you’ll see why use this.

app/views/logo/get.rhtml
    <%= error_messages_for("logo") -%>
    <% form_for (:logo, :url=>{:action => 'save'} , :html => {:multipart => true} ) do |form|%>
    <%= form.file_field("uploaded_logo") %>&nbsp;
    <%= submit_tag("Upload")%>
    <%end%>


In the above template file, we created a upload field named “uploaded_logo”, so when the form is submitted, the function “uploaded_logo=” will be called . Of course, we need to edit the controller.

app/controllers/logo_controller.rb

    class LogoController < ApplicationController
      def get
        @logo = Logo.new
      end
     
      def save
        @logo = Logo.new(params[:logo])
        if @logo.save
          redirect_to(:action => "got" , :id => @logo.id)
       else
         render :action=>"get"
       end
     end
    
     def view
       @logo = Logo.find(params[:id])
       send_data(@logo.data, :type=>@logo.content_type,:disposition=>"inline")
     end
    
     def got
       @logo = Logo.find(params[:id])
     end
   end


Take a look at the “view” action, it makes good use of function “send_data”. Now we’re able to get the picture via /view/id , which contains extra content-type message in the header. Now it’s the last part of this demo, the template of action “got”.

app/views/logo/got.rhtml

  
<img src="<%= url_for :action=>"view", :id=>@logo.id %>" />


Of course, to make the pages better, you have to create a layout for logo. Besides, you may need to do some verification before enabling the upload.

If you want to store the pictures in files, just read the data out and write to a new file, which is in a visitable folder.
分享到:
评论

相关推荐

    rails 2.3 chm文档 ,官方最新版

    rails 2.3 chm文档 官方最新版

    railsbrain网站的rails2.3文档(bug修复版)

    Railsbrain是一个专注于Rails框架的在线资源平台,而这个“railsbrain网站的rails2.3文档(bug修复版)”显然是一份针对Rails 2.3版本的更新文档,旨在修复用户在浏览和交互过程中遇到的问题。Rails是Ruby编程语言的...

    Ruby on Rails 2.3 Guide.chm

    Ruby on Rails Guide:是rails官方教程,本人为了大家学习查阅的方便,制成chm格式。就如同java doc的chm格式一样方便。

    ruby on rails 2.3.5 api html版

    10. **插件和Gem**:Rails的生态系统中,Gem是第三方库的主要形式,它们提供了额外的功能,如Devise用于身份验证,CanCanCan用于授权,Paperclip或Carrierwave处理文件上传等。 11. **部署**:了解如何将Rails应用...

    rails 3.2 API

    Rails 3.2 API 是一个重要的开发资源,主要用于Ruby on Rails框架的开发。Rails是基于Ruby语言的一个开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,广泛应用于构建动态网站和Web应用程序。Rails ...

    rails2.3.2

    描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...

    rails上传文件_paperclip

    通过上述内容,我们可以看到Paperclip为Rails应用中的文件上传提供了强大的功能和灵活性。无论是简单的图片上传还是复杂的文件管理,Paperclip都能轻松应对。在实际开发中,可以根据项目需求对这些知识点进行深入...

    rails_多文件上传

    Rails 多文件上传插件实现详解 Rails 多文件上传插件是基于 Ruby on Rails 框架的一款插件,旨在实现多文件的同时上传,控制文件的格式、数量,并且兼容多种浏览器,包括 IE6、7、Firefox 等。下面是对插件的详细...

    rails guides 2.3 CHM版

    rails guides的CHM版本,这个向导的版本是2.3

    i18n_routing:用于Rails 2.3.x和Rails的I18n路由模块。轻松转换您的路由!

    所有必需的信息都可以在Wiki上找到: 如有疑问,请使用i18_routing谷歌论坛: 适用于Rails 2.3、3.0、3.1和3.2下一个版本的TODO(写于2010年6月9日) 处理同一资源名称的多个翻译(例如:嵌套和非嵌套资源) 处理...

    Rails中上传文件保存中文文件名乱码

    在Rails框架中处理文件上传时,经常会遇到一个问题,那就是当用户尝试上传包含中文名称的文件时,文件名可能会出现乱码。这个问题主要是由于字符编码不兼容导致的。Rails默认使用UTF-8编码,但文件系统或者某些外部...

    jquery-fileupload-rails, 用于 Rails的jQuery文件上传集成.zip

    jquery-fileupload-rails, 用于 Rails的jQuery文件上传集成 Rails 文件上传jQuery-File-Plugin 是一个文件上传插件,由的Tschan 。 jQuery文件上传功能多文件选择。drag&拖放支持。进度栏和jQuery预览图像。 支持...

    rails 文件上传

    5. **CarrierWave**: 如果你的Rails版本较低,或者需要更灵活的文件上传控制,可以使用CarrierWave库。它提供了一个简单的接口来处理文件上传,包括存储位置、版本管理和缩略图生成等。 6. **Paperclip**: ...

    Rails里给文件上传添加progress_bar

    在Ruby on Rails(Rails)框架中,为文件上传添加进度条功能可以显著提升用户体验,让用户在上传大文件时能够清楚地看到进度,增加交互性。本文将深入探讨如何在Rails应用中实现这一功能。 首先,我们需要理解文件...

    pgq:基于 PgQ Skytools for PostgreSQL 的 ARRails 队列系统,如 Resque on Redis。 Rails 2.3 和 3 兼容

    Rails 2.3 和 3 兼容。 关于 PgQ 安装 安装天空工具:Ubuntu 11.10: # apt-get install postgresql-server postgresql-client # apt-get install skytools 宝石档案: gem 'pgq' 从 database.yml 创建股票...

    rails ajax提交文件或图片

    最后,为了处理文件上传的进度,我们可以使用HTML5的`FormData`对象和`XMLHttpRequest`的`progress`事件。在`form_for`中,我们添加一个`onsubmit`事件处理器: ```html , url: uploads_path, ...

    升级版本后Rails的文件上传

    10. **日志记录**:在`log`目录下的日志文件可以提供关于文件上传操作的详细信息,这对于排查问题非常有用。确保日志配置得当,以便在出现问题时能快速定位。 升级Rails版本涉及的文件上传变更可能需要对代码进行...

    终于知道怎么把rails Web程序打包成可执行文件了

    通过JRuby,我们可以使用`jruby-wrappers`或`jruby-complete`来创建自包含的JAR文件,这基本上就是一个可执行的Rails应用。JRuby允许Rails应用运行在任何支持Java的平台上。 2. **Warbler**: 如果你打算在Java应用...

    swagger-docs, 为 Rails api生成 swagger ui json文件,使用简单的DSL.zip

    swagger-docs, 为 Rails api生成 swagger ui json文件,使用简单的DSL Swagger::Docs使用api为 Rails 应用生成swagger的ui json文件。 你可以向控制器类添加 swagger DSL,然后运行一个rake任务来生成json文件。 ...

    使用Rails上传和转换视频

    在Rails中,最常用的文件上传库是Paperclip和CarrierWave,但现在更推荐使用ActiveStorage,这是Rails 5.2及更高版本内置的一个功能。ActiveStorage直接与数据库交互,方便管理和存储文件,同时支持通过第三方服务如...

Global site tag (gtag.js) - Google Analytics