- 浏览: 104801 次
- 性别:
- 来自: 温州
文章分类
最新评论
-
623deyingxiong:
你好,这个视频网址要翻-墙吗?貌似打不开的说。
推荐一个vim视频教程-Vim for Rails Developers -
wellee:
xici_magic 写道多谢楼主分享收集啦。不谢,如果可以还 ...
iOS 开发教程资源列表 -
xici_magic:
多谢楼主分享收集啦。
iOS 开发教程资源列表 -
cgx999:
hi,这个可以给我共享么?多谢了。
推荐一个vim视频教程-Vim for Rails Developers -
longhong:
使用NERDTree插件,最下面的命令行窗口经常会显示信 ...
[转]NERD_tree:Vim 文件浏览器插件
Rails 2.3.4 and SWFUpload – Rack Middleware for Flash Uploads that Degrade Grace
- 博客分类:
- rails skills
Browser upload controls have been pretty much the same for years. They are very difficult to style, and do not look consistent across browsers. Perhaps the biggest issue with them is they provide no feedback to the user about how long the submission will take. One alternative is to use Flash for the uploads. There are numerous libraries available, I likeSWFUpload. Since the reason you are here is probably because you can’t get it working in Rails, I’m going to try and help you deal with the quirks associated with using Flash and Rails together. It used to be you would monkeypatch the CGI class to get Flash uploaders to work due to issues with Flash. With the introduction of Rack in Rails 2.3 things now work quite differently. What we will do is create some rack middleware to intercept traffic from Flash to deal with it’s quirks. I have created a small example application of an mp3 player and uploader. You will probably want to download it, as it contains a few files not displayed in this article. You can clone it from the github project page. First lets create a simple Song model: title, artist, and length_in_seconds are meta-data we will pull from the ID3 tags of the uploaded mp3 file, and the rest will be used by Paperclip to handle the attachment. Lets add the paperclip attachment and a few simple validations to our new Song model: Next comes an upload form and some containers to hold the SWFUploader: The container that holds the SWFUploader will be hidden until we know the user can support it. Initially a standard file upload form will display. A number of things can go wrong, so we need to think about a few levels of degradation here. The user might not have flash installed, the user might have an outdated version of flash, he might not have javascript installed or enabled(which is needed to load the flash), and there may be a problem downloading the flash swf file. Yikes. Luckily using the swfobject library we can easily handle all these potential issues. If the user is missing javascript, he will see the message in the noscript tag and be presented a standard upload control. If the user is missing flash or it is outdated, he will be presented a dialog with an upgrade link. Otherwise he can use the standard upload control. If everything goes okey-dokey, then some function handlers we write will hide the the degradation container, and display the flash container. Oh, and just so you know the current version of Flash Player for linux do not fire the event that monitors upload progress, so you will not get the status bar until the upload finishes. No work around for that right now. So lets initialize the SWFUpload via some javascript. Many tutorials out there seem to put the authentication token and session information in the URL, but there are some options with current version of SWFUpload to POST and avoid that. You will want to check out the official SWFUpload docs to understand what all of these variable do. There are many handlers we have to define to handle various events, and if you clone the project you can review them in detail. We also need to set styles for the containers that will be generated. You can see the Sass file I created for SWFUploadhere, and another one for Ryan Bates nifty_generators. Another quirk we have to be aware of when dealing with flash uploads is that everything gets a content-type of an octet stream. We will use the mime-types library to identify it for validation. Keep in mind it only uses the extension to determine the file type. (I haven’t tested it yet, but I believe mimetype-fu will actually check file-data and magic numbers). By default SWFUpload calls the file parameter ‘Filedata’. Another annoyance with flash uploads is that it doesn’t send cookie data. That is why we are sending the session information in the POST data. We will intercept requests from Flash, check for the session key, and if so inject it into the cookie header. We can do this with some pretty simple middleware. This is a modified version from code the appears in a few tutorials about flash uploads. It will allow the session information to be in the query string *or* POST data. Next we have to make sure this middleware gets put to use so inconfig/initializers/session_store.rb add: And that’s, uhh, all there is too it. Again, I really suggest you checkout the example project. It also uses the nifty WordPress Audio Player flash control to play the music you upload!Rails 2.3.4 and SWFUpload – Rack Middleware for Flash Uploads that Degrade Gracefully
./script generate model Song title:string artist:string length_in_seceonds:integer track_file_name:string track_content_type:string track_file_size:integer
class Song < ActiveRecord::Base
has_attached_file :track,
:path => ":rails_root/public/assets/:attachment/:id_partition/:id/:style/:basename.:extension",
:url => "/assets/:attachment/:id_partition/:id/:style/:basename.:extension"
validates_presence_of :title, :artist, :length_in_seconds
validates_attachment_presence :track
validates_attachment_content_type :track, :content_type => [ 'application/mp3', 'application/x-mp3', 'audio/mpeg', 'audio/mp3' ]
validates_attachment_size :track, :less_than => 20.megabytes
attr_accessible :title, :artist, :length_in_seconds
def convert_seconds_to_time
total_minutes = length_in_seconds / 1.minutes
seconds_in_last_minute = length_in_seconds - total_minutes.minutes.seconds
"#{total_minutes}m #{seconds_in_last_minute}s"
end
end
- form_tag songs_path, :multipart => true do
#swfupload_degraded_container
%noscript= "You should have Javascript enabled for a nicer upload experience"
= file_field_tag :Filedata
= submit_tag "Add Song"
#swfupload_container{ :style => "display: none" }
%span#spanButtonPlaceholder
#divFileProgressContainer
:javascript
SWFUpload.onload = function() {
var swf_settings = {
// SWFObject settings
minimum_flash_version: "9.0.28",
swfupload_pre_load_handler: function() {
$('#swfupload_degraded_container').hide();
$('#swfupload_container').show();
},
swfupload_load_failed_handler: function() {
},
post_params: {
"#{session_key_name}": "#{cookies[session_key_name]}",
"authenticity_token": "#{form_authenticity_token}",
},
upload_url: "#{songs_path}",
flash_url: '/flash/swfupload/swfupload.swf',
file_types: "*.mp3",
file_types_description: "mp3 Files",
file_size_limit: "20 MB",
button_placeholder_id: "spanButtonPlaceholder",
button_width: 380,
button_height: 32,
button_text : '<span class="button">Select Files <span class="buttonSmall">(20 MB Max)</span></span>',
button_text_style : '.button { font-family: Helvetica, Arial, sans-serif; font-size: 24pt; } .buttonSmall { font-size: 18pt; }',
button_text_top_padding: 0,
button_text_left_padding: 18,
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
button_cursor: SWFUpload.CURSOR.HAND,
file_queue_error_handler : fileQueueError,
file_dialog_complete_handler : fileDialogComplete,
upload_progress_handler : uploadProgress,
upload_error_handler : uploadError,
upload_success_handler : uploadSuccess,
upload_complete_handler : uploadComplete,
custom_settings : {
upload_target: "divFileProgressContainer"
}
}
var swf_upload = new SWFUpload(swf_settings);
};
def create
require 'mp3info'
mp3_info = Mp3Info.new(params[:Filedata].path)
song = Song.new
song.artist = mp3_info.tag.artist
song.title = mp3_info.tag.title
song.length_in_seconds = mp3_info.length.to_i
params[:Filedata].content_type = MIME::Types.type_for(params[:Filedata].original_filename).to_s
song.track = params[:Filedata]
song.save
render :text => [song.artist, song.title, song.convert_seconds_to_time].join(" - ")
rescue Mp3InfoError => e
render :text => "File error"
rescue Exception => e
render :text => e.message
end
require 'rack/utils'
class FlashSessionCookieMiddleware
def initialize(app, session_key = '_session_id')
@app = app
@session_key = session_key
end
def call(env)
if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
params = ::Rack::Request.new(env).params
env['HTTP_COOKIE'] = [ @session_key, params[@session_key] ].join('=').freeze unless params[@session_key].nil?
end
@app.call(env)
end
end
ActionController::Dispatcher.middleware.insert_before(ActionController::Base.session_store, FlashSessionCookieMiddleware, ActionController::Base.session_options[:key])
发表评论
-
Textamate Resources
2011-03-22 00:38 897教程 http://projects.serenity.de ... -
rails mac + mysql 5.5 +rvm libmysqlclient.16.dylib 问题
2011-03-20 17:00 1784配置OS X rails环境,参考 http://ww ... -
think vitamin
2011-03-13 18:02 0http://www.filesonic.com/folder ... -
peepcode 下载
2011-03-03 15:00 0http://sevno.org/video-training ... -
pagination and ajax with rails 3 resources
2011-02-21 07:48 1073Unobtrusive Javascript ... -
[翻译]MetaWhere & MetaSearch
2011-02-20 19:13 0http://asciicasts.com/episodes/ ... -
常用插件使用
2011-02-20 00:01 670Authentication: restful-a ... -
High Quality Ruby on Rails Example Applications
2011-02-19 20:28 1213High Quality Ruby on Rails Ex ... -
Secrets of the Rails Console Ninjas
2011-02-19 16:06 1225http://slash7.com/2006/12/21/s ... -
rails.vim resources
2011-02-16 22:24 994主页 http://rails.vim.tpop ... -
Rails based 项目管理
2011-02-15 22:04 704http://www.redmine.org/ -
railscasts
2011-02-14 23:58 717http://www.56.com/w21/album-aid ... -
Rails Guys
2011-02-14 23:49 617http://www.allenwei.cn/ Rails ... -
ubuntu10.4 + rvm + passenger + nginx + REE(ruby 1.8.7)
2011-01-05 22:13 0Ubuntu server 安装记 首先要考虑好和配置 ... -
rails 中的 时间
2009-06-22 17:58 1006rails中的时间显示格式 在rails中需要显示时 ...
相关推荐
标题 "ruby 1.8.7 rails 2.3.4" 提及的是 Ruby 语言的一个较旧版本(1.8.7)以及与其兼容的 Rails 框架的老版本(2.3.4)。Ruby 是一种面向对象的、动态类型的编程语言,而 Rails 是一个基于 MVC(模型-视图-控制器...
`weixin_rails_middleware` 是基于 Ruby 的 Rack 技术构建的,它能够插入到 Rails 应用的请求处理流程中。当收到微信服务器发来的请求时,中间件会自动处理这些请求,如验证签名、解析XML数据,并提供相应的响应。 ...
Create reusable components that bring Bootstrap and Angular together and effectively use materialized views for caching within Postgres. Get your front end working with Webpack, use Postgres' ...
Continuous Testing (CT) is a developer practice that shortens the feedback loops established by test-driven development and continuous integration. Building on techniques used by Agile software ...
标题 "ralis gem files" 指向的是与 Rails 框架相关的宝石(gem)文件,特别是针对 Rails 2.3.4 版本。Rails 是一个流行的开源 web 应用程序框架,由 Ruby 语言编写,遵循 Model-View-Controller (MVC) 设计模式,...
This pioneering book is the first resource that deep dives into the new Rails 3 APIs and shows you how use them to write better web applications and make your day-to-day work with Rails more ...
Ruby on Rails is the revolutionary online programming tool that makes creating functional e-commerce web sites faster and easier than ever. With the intuitive, straightforward nature of Ruby and the ...
### Rails for Zombies 知识点解析 #### 一、Rails for Zombies 介绍 Rails for Zombies 是一套面向初学者的 Ruby on Rails 教程。通过一系列有趣且互动性强的练习,帮助学习者掌握 Rails 的基本概念和技术。课程...
**Ruby for Rails** Ruby是一种面向对象的动态编程语言,它以其简洁、优雅的语法和强大的元编程能力而闻名。在Web开发领域,Ruby与Rails框架的结合,即Ruby on Rails(RoR),开创了Web应用的新纪元。Ruby on Rails...
RJS templates are an exciting and powerful new type of template added to Rails 1.1. Unlike conventional Rails templates that generate HTML or XML, RJS templates generate JavaScript code that is ...
It’s a broad, far-reaching tutorial and reference that’s recommended by the Rails core team. If you’re new to Rails, you’ll get step-by-step guidance. If you’re an experienced developer, this ...
RUBY的经典之作,对其在RAILS下开发写得很详细
Bootstrap is a free, open source CSS and JS framework that helps you create websites in minutes, and Ruby on Rails, or Rails as it's known, is an open source web application framework written in the ...
《Ruby on Rails for Dummies》是一本专门为初学者设计的Ruby on Rails教程,它旨在帮助新手快速理解并掌握这个强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby编程语言构建的一个开源Web应用程序框架,它...
Ruby for Rails 英文原版, pdf格式 <br>本书是一部专门为Rails实践而写的经典Ruby著作,由四部分组成,共17章。第一部分讲述Ruby和Rails的编程环境。第二部分和第三部分与 Rails紧密联系,着重对Ruby这门语言...