uploader 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +275 -0
  3. data/Rakefile +66 -0
  4. data/TODO +2 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/uploader/uploads_controller.rb +122 -0
  7. data/app/helpers/uploader_helper.rb +17 -0
  8. data/app/views/uploads/_swf_javascript.html.erb +63 -0
  9. data/app/views/uploads/_swf_upload.html.erb +32 -0
  10. data/config/uploader_routes.rb +3 -0
  11. data/db/migrate/20090517040220_create_uploads.rb +38 -0
  12. data/lib/active_record/acts/uploader_upload.rb +235 -0
  13. data/lib/uploader/exceptions.rb +5 -0
  14. data/lib/uploader/initialize_routes.rb +8 -0
  15. data/lib/uploader/middleware/flash_session_cookie_middleware.rb +18 -0
  16. data/lib/uploader/mime_type_groups.rb +18 -0
  17. data/lib/uploader/tasks.rb +36 -0
  18. data/lib/uploader.rb +24 -0
  19. data/locales/ar.yml +17 -0
  20. data/locales/bg.yml +17 -0
  21. data/locales/ca.yml +17 -0
  22. data/locales/cs.yml +17 -0
  23. data/locales/da.yml +17 -0
  24. data/locales/de.yml +17 -0
  25. data/locales/el.yml +17 -0
  26. data/locales/en.yml +16 -0
  27. data/locales/es.yml +17 -0
  28. data/locales/fr.yml +17 -0
  29. data/locales/it.yml +17 -0
  30. data/locales/iw.yml +17 -0
  31. data/locales/ja.yml +17 -0
  32. data/locales/ko.yml +17 -0
  33. data/locales/lt.yml +17 -0
  34. data/locales/lv.yml +17 -0
  35. data/locales/nl.yml +17 -0
  36. data/locales/no.yml +18 -0
  37. data/locales/pl.yml +17 -0
  38. data/locales/pt.yml +17 -0
  39. data/locales/ro.yml +17 -0
  40. data/locales/ru.yml +17 -0
  41. data/locales/sk.yml +17 -0
  42. data/locales/sl.yml +17 -0
  43. data/locales/sr.yml +17 -0
  44. data/locales/sv.yml +17 -0
  45. data/locales/tl.yml +17 -0
  46. data/locales/uk.yml +17 -0
  47. data/locales/vi.yml +17 -0
  48. data/locales/zh-CN.yml +17 -0
  49. data/locales/zh-TW.yml +17 -0
  50. data/locales/zh.yml +17 -0
  51. data/pkg/uploader-0.1.0.gem +0 -0
  52. data/pkg/uploader-0.1.1.gem +0 -0
  53. data/pkg/uploader-0.1.2.gem +0 -0
  54. data/public/images/SWFUploadButton.png +0 -0
  55. data/public/images/file_icons/excel.gif +0 -0
  56. data/public/images/file_icons/file.gif +0 -0
  57. data/public/images/file_icons/mp3.gif +0 -0
  58. data/public/images/file_icons/pdf.gif +0 -0
  59. data/public/images/file_icons/text.gif +0 -0
  60. data/public/images/file_icons/word.gif +0 -0
  61. data/public/javascripts/swfupload/fileprogress.js +151 -0
  62. data/public/javascripts/swfupload/handlers.js +206 -0
  63. data/public/javascripts/swfupload/swfupload.cookies.js +53 -0
  64. data/public/javascripts/swfupload/swfupload.js +945 -0
  65. data/public/javascripts/swfupload/swfupload.queue.js +77 -0
  66. data/public/javascripts/swfupload/swfupload.swfobject.js +110 -0
  67. data/public/stylesheets/swfupload.css +26 -0
  68. data/public/swf/swfupload.swf +0 -0
  69. data/rails/init.rb +10 -0
  70. data/tasks/rails.rake +2 -0
  71. data/test/test_helper.rb +3 -0
  72. data/test/unit/upload_test.rb +5 -0
  73. data/uninstall.rb +0 -0
  74. data/uploader.gemspec +127 -0
  75. metadata +128 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Justin Ball
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,275 @@
1
+ = Uploader
2
+
3
+ Uploader makes it easy to integrate multiple file uploads into your application using SWFUpload
4
+
5
+
6
+ == Installation
7
+
8
+ === Install Dependancies:
9
+ sudo gem install mime-types
10
+
11
+
12
+ === Install the gem:
13
+ sudo gem install uploader
14
+
15
+
16
+ === Add the gem to environment.rb
17
+ config.gem 'uploader'
18
+
19
+
20
+ === Create a model for uploads.
21
+ We recommend creating a model called upload.rb. acts_as_uploader accepts all valid options for paperclip via :has_attached_file => {}
22
+
23
+ class Upload < ActiveRecord::Base
24
+ acts_as_uploader :enable_s3 => false,
25
+ :has_attached_file => {
26
+ :url => "/system/:attachment/:id_partition/:style/:basename.:extension",
27
+ :path => ":rails_root/public/system/:attachment/:id_partition/:style/:basename.:extension",
28
+ :styles => { :icon => "30x30!",
29
+ :thumb => "100>",
30
+ :small => "150>",
31
+ :medium => "300>",
32
+ :large => "660>"},
33
+ :default_url => "/images/profile_default.jpg",
34
+ :storage => :s3,
35
+ :s3_credentials => File.join(RAILS_ROOT, 'config', 's3.yml'),
36
+ :bucket => "assets.#{SITE[:domain]}",
37
+ :s3_host_alias => "assets.#{SITE[:domain]}",
38
+ :convert_options => {
39
+ :all => '-quality 80'
40
+ }
41
+
42
+ # only allow images:
43
+ # validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/pjpeg', 'image/jpg']
44
+
45
+ # The following method is implemented in 'acts_as_uploader'. This is the method destroy will check to see if
46
+ # the user has permission to delete the object. Add additional logic as needed or if the existing logic
47
+ # looks fine then feel free to delete this comment and the can_edit? method.
48
+ def can_edit?(check_user)
49
+ return false if user.blank?
50
+ check_user == self.user
51
+ end
52
+
53
+ end
54
+
55
+
56
+ === Add multiple file uploads to one of your models
57
+
58
+ Your uploads will need a parent object to attach to. For example, a user might have many files:
59
+
60
+ class User < ActiveRecord::Base
61
+ has_many :uploads, :as => :uploadable, :order => 'created_at desc', :dependent => :destroy
62
+
63
+ def can_upload?(check_user)
64
+ self == check_user
65
+ end
66
+ end
67
+
68
+ or a photo album might have many photos
69
+
70
+ class PhotoAlbum < ActiveRecord::Base
71
+ has_many :photos, :as => :uploadable, :order => 'created_at desc', :dependent => :destroy
72
+
73
+ def can_upload?(check_user)
74
+ self.editors.include?(check_user)
75
+ end
76
+ end
77
+
78
+ Note that in both examples there is an implementation of 'can_upload?'. This method must be
79
+ included in any parent object and will control who has permission to upload files.
80
+
81
+ === The application controller
82
+ Be sure you have turned on protect from forgery. This is required for uploader to get the appropriate tokens
83
+ from your Rails application. It is also a good idea and is the default in new Rails applications.
84
+
85
+ protect_from_forgery # See ActionController::RequestForgeryProtection for details
86
+
87
+ === The uploads controller
88
+ You can modify the upload controller behavior by inheriting from the uploader controller. For example, you might want to
89
+ require that users be logged in to upload a file. There are a number of methods in the uploads controller that contain
90
+ default functionality that you may consider overriding.
91
+
92
+ Be sure to modify your routes file. Add the following line to ensure that your application uses the new uploads
93
+ controller instead of directly using the one inside the gem:
94
+
95
+ map.resources :uploads, :collection => { :swfupload => :post }
96
+
97
+
98
+ class UploadsController < Uploader::UploadsController
99
+
100
+ before_filter :login_required
101
+
102
+ protected
103
+
104
+ # The default 'get_upload_text' method throws an exception. You must override this method in your controller. It
105
+ # is used by the swf upload call to generate the html to be returned to the client.
106
+ # Here's an example:
107
+ def get_upload_text(upload)
108
+ render_to_string( :partial => 'uploads/upload_row', :object => upload, :locals => { :parent => @parent } )
109
+ end
110
+
111
+ # The existing method will handle most cases but you might choose a different message or a different redirect:
112
+ def permission_denied
113
+ message = t("uploader.permission_denied")
114
+ respond_to do |format|
115
+ format.html do
116
+ flash[:notice] = message
117
+ redirect_to get_redirect
118
+ end
119
+ format.js { render :text => message }
120
+ format.json { render :json => { :success => false, :message => message } }
121
+ end
122
+ end
123
+
124
+ # Simply attempts to redirect to the parent object. You might want to build something more sophisticated that
125
+ # redirect to different areas of you site depending on the type of object that was uploaded or on based on the parent.
126
+ def get_redirect
127
+ @parent
128
+ end
129
+
130
+ # The default action is to call 'can_upload?' on the parent object. Be sure to implement 'can_upload?(check_user) on
131
+ # your parent objects
132
+ def has_permission_to_upload(user, upload_parent)
133
+ upload_parent.can_upload?(user)
134
+ end
135
+
136
+
137
+ # By default the controller will use a model named 'Upload' to do a destroy. If you want to use a different model
138
+ # you'll need to override 'set_upload_for_destroy in your controller to find the object using a different object.
139
+ # For example:
140
+ def set_upload_for_destroy
141
+ @upload = Photo.find(params[:id])
142
+ end
143
+
144
+ end
145
+
146
+
147
+ === Other Methods
148
+
149
+ uploader assumes that you have a method called 'redirect_back_or_default' which is common in many Rails projects. This method
150
+ is called upon completion of destroy or created when the requested format is 'html'. A simple implementation of this method is listed
151
+ below:
152
+
153
+ def redirect_back_or_default(default)
154
+ redirect_to(session[:return_to] || default)
155
+ session[:return_to] = nil
156
+ end
157
+
158
+
159
+ === Configure your views.
160
+ You'll need something like this in your layout so that uploader can add in the required css and javascript files.
161
+
162
+ <%= yield :head -%>
163
+
164
+ Then to add an upload form:
165
+ <%= upload_form(parent_object) %>
166
+ parent_object should be the object which owns the uploads. ie a user, photo_album, etc.
167
+
168
+ === Rake Tasks
169
+
170
+ Add the rake tasks for uploader to your project. You will need to add the following to your applications's Rakefile
171
+
172
+ require 'uploader'
173
+ require 'uploader/tasks'
174
+
175
+ Then run:
176
+ rake uploader:sync
177
+
178
+ Last run:
179
+ rake db:migrate
180
+ This will create an uploads table for you. If you selected a different name for your model you will need to modify the migration accordingly.
181
+ == WARNING
182
+ The migration will drop any existing 'uploads' table you have in place
183
+
184
+
185
+ That will copy all the required javascript and asset files into your project
186
+
187
+
188
+ == Amazon s3
189
+
190
+
191
+ If you'd like to store your uploads on Amazon's S3 service there are a few extra steps involved. See the example file above
192
+ to view the options in context.
193
+
194
+ === Turn on s3
195
+ Set the enable_s3 option to true in acts_as_uploader
196
+ :enable_s3 => true
197
+
198
+ Pass your s3 credentials into acts_as_uploader
199
+ :has_attached_file => { :s3_credentials => File.join(RAILS_ROOT, 'config', 's3.yml') }
200
+
201
+ === Setup your credentials
202
+ Create a file named s3.yml in your configuration directory and add the following lines:
203
+
204
+ access_key_id: PUT YOUR KEY HERE
205
+ secret_access_key: PUT YOUR SECRET ACCESS KEY HERE
206
+
207
+
208
+ === Turn on the Daemon process
209
+ There are a number of timing issues that you will run into if you attempt to upload files directly to s3. To overcome that
210
+ problem uploader includes a daemon process which will send the files to Amazon asynchronously. Note that the uploader
211
+ will leave your local copy in place.
212
+ TODO docs for Daemon
213
+
214
+
215
+ == Other Stuff
216
+
217
+ If you'd like to add an ajax delete to your uploads page this code might come in handy.
218
+
219
+ Say you have chosen to display your upload in a table. Your code might look like the following. Note that there are a number of assumptions made in this code. Modify it to suite your needs.
220
+
221
+ <tr id="<%= upload_row.dom_id %>" class="delete-container <%= cycle('odd', 'even') %>" <%=style-%> >
222
+ <td><div class="file-icon"><%= image_tag upload_row.icon -%></div></td>
223
+ <td><a href="<%=upload_row.file.url%>"><%= truncate(sanitize(upload_row.file_name), 100) %></a></td>
224
+ <td><%= upload_row.created_at.to_s(:long) -%></td>
225
+ <td>
226
+ <% if parent.can_edit?(current_user) -%>
227
+ <% form_for(:upload, :url => upload_path(upload_row.id), :html => { :class => "delete-form", :method => :delete} ) do |f| -%>
228
+ <%= image_submit_tag '/images/icons/delete.png', {:id => 'submit-comment', :title => t('general.delete_file'), :class => 'submit-delete', :width => '12', :height => '12', :alt => t('general.delete_file') } %>
229
+ <% end -%>
230
+ <% if !style.empty? -%>
231
+ <script type="text/javascript" language="JavaScript">
232
+ jQuery("#<%= upload_row.dom_id %>").fadeIn("slow");
233
+ </script>
234
+ <% end -%>
235
+ <% end -%>
236
+ </td>
237
+ </tr>
238
+
239
+
240
+ I put the following in my main upload view
241
+ <% content_for :javascript do -%>
242
+
243
+ setup_submit_delete();
244
+
245
+ function upload_completed_callback(data){
246
+ jQuery('#upload-list').prepend(data);
247
+ setup_submit_delete();
248
+ }
249
+ <% end -%>
250
+
251
+
252
+
253
+ The following jQuery code will do an ajax delete for you
254
+
255
+ function setup_submit_delete(){
256
+ jQuery(".submit-delete").click(function() {
257
+ // if(!confirm("Are you sure?")){
258
+ // return false;
259
+ // }
260
+ jQuery(this).parents('.delete-container').fadeOut();
261
+ var form = jQuery(this).parents('form');
262
+ jQuery.post(form.attr('action') + '.json', form.serialize(),
263
+ function(data){
264
+ var json = eval('(' + data + ')');
265
+ if(!json.success){
266
+ jQuery.jGrowl.info(json.message);
267
+ }
268
+ });
269
+ return false;
270
+ });
271
+ }
272
+
273
+
274
+
275
+ Copyright (c) 2009 Justin Ball, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the uploader plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the uploader plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'Uploader'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+ begin
26
+ require 'jeweler'
27
+ Jeweler::Tasks.new do |gemspec|
28
+ gemspec.name = "uploader"
29
+ gemspec.summary = "SWFUpload + Paperclip wrapped in an engine with love."
30
+ gemspec.email = "justinball@gmail.com"
31
+ gemspec.homepage = "http://github.com/jbasdf/uploader"
32
+ gemspec.description = "Uploader gem that makes it simple add multiple file uploads to your Rails project using SWFUpload and Paperclip"
33
+ gemspec.authors = ["Justin Ball", "David South"]
34
+ gemspec.files.include %w( tasks/rails.rake lib/uploader/*.rb lib/uploader/middleware/*.rb db/migrate/*.rb public/images/file_icons/* app/views/uploads/* )
35
+ gemspec.rubyforge_project = 'uploader'
36
+ end
37
+ rescue LoadError
38
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
39
+ end
40
+
41
+ # rubyforge tasks
42
+ begin
43
+ require 'rake/contrib/sshpublisher'
44
+ namespace :rubyforge do
45
+
46
+ desc "Release gem and RDoc documentation to RubyForge"
47
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
48
+
49
+ namespace :release do
50
+ desc "Publish RDoc to RubyForge."
51
+ task :docs => [:rdoc] do
52
+ config = YAML.load(
53
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
54
+ )
55
+
56
+ host = "#{config['username']}@rubyforge.org"
57
+ remote_dir = "/var/www/gforge-projects/the-perfect-gem/"
58
+ local_dir = 'rdoc'
59
+
60
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
61
+ end
62
+ end
63
+ end
64
+ rescue LoadError
65
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
66
+ end
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ Figure out how to localize javascript files
2
+ Write the tests
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.3
@@ -0,0 +1,122 @@
1
+ class Uploader::UploadsController < ApplicationController
2
+ unloadable
3
+
4
+ before_filter :get_parent, :only => [:create, :swfupload]
5
+ before_filter :set_upload_for_destroy, :only => [:destroy]
6
+
7
+ def create
8
+ # Standard, one-at-a-time, upload action
9
+ @upload = @parent.uploads.build(params[:upload])
10
+ @upload.creator = current_user
11
+ @upload.save!
12
+ message = t('uploader.successful_upload')
13
+ upload_json = basic_uploads_json(@upload)
14
+
15
+ respond_to do |format|
16
+ format.html do
17
+ flash[:notice] = message
18
+ redirect_to redirect_back_or_default(get_redirect)
19
+ end
20
+ format.js { render :text => get_upload_text(@upload) }
21
+ format.json { render :json => upload_json }
22
+ end
23
+ rescue => ex
24
+ message = t('uploader.standard_file_upload_error', :error => ex)
25
+ respond_to do |format|
26
+ format.html do
27
+ flash[:notice] = message
28
+ redirect_back_or_default(get_redirect)
29
+ end
30
+ format.js { render :text => message }
31
+ format.json { render :json => { :success => false, :message => message } }
32
+ end
33
+ end
34
+
35
+ def swfupload
36
+ @upload = @parent.uploads.build
37
+ @upload.is_public = true if params[:is_public] == true
38
+ @upload.creator = current_user
39
+ @upload.swfupload_local = params[:Filedata]
40
+ @upload.save!
41
+ @parent.uploads << @upload
42
+ respond_to do |format|
43
+ format.js { render :text => get_upload_text(@upload) }
44
+ format.json { render :json => basic_uploads_json(@upload) }
45
+ end
46
+ rescue => ex
47
+ message = t('uploader.standard_file_upload_error', :error => ex)
48
+ respond_to do |format|
49
+ format.js { render :text => message }
50
+ format.json { render :json => { :success => false, :message => message } }
51
+ end
52
+ end
53
+
54
+ def destroy
55
+ @parent = @upload.uploadable # set this for redirect
56
+ if @upload.can_edit?(current_user)
57
+ @upload.destroy
58
+ message = t('uploader.file_deleted')
59
+ success = true
60
+ else
61
+ message = t("uploader.file_delete_permission_denied")
62
+ success = false
63
+ end
64
+ respond_to do |format|
65
+ format.html do
66
+ flash[:notice] = message
67
+ redirect_back_or_default(get_redirect)
68
+ end
69
+ format.js { render :text => message }
70
+ format.json { render :json => { :success => success, :message => message } }
71
+ end
72
+ end
73
+
74
+ protected
75
+
76
+ def get_upload_text(upload)
77
+ raise 'implement get_upload_text in your controller'
78
+ end
79
+
80
+ def set_upload_for_destroy
81
+ @upload = Upload.find(params[:id])
82
+ end
83
+
84
+ def permission_denied
85
+ message = t("uploader.permission_denied")
86
+ respond_to do |format|
87
+ format.html do
88
+ flash[:notice] = message
89
+ redirect_to get_redirect
90
+ end
91
+ format.js { render :text => message }
92
+ format.json { render :json => { :success => false, :message => message } }
93
+ end
94
+ end
95
+
96
+ # override this method in your controller to set the redirect file upload completion
97
+ # alternatively set redirect_back_or_default
98
+ def get_redirect
99
+ @parent
100
+ end
101
+
102
+ def get_parent
103
+ if !params[:parent_type] || !params[:parent_id]
104
+ raise t('uploader.missing_parent_id_error')
105
+ return
106
+ end
107
+ @klass = params[:parent_type].to_s.capitalize.constantize
108
+ @parent = @klass.find(params[:parent_id])
109
+ unless has_permission_to_upload(current_user, @parent)
110
+ permission_denied
111
+ end
112
+ end
113
+
114
+ def has_permission_to_upload(user, upload_parent)
115
+ upload_parent.can_upload?(user)
116
+ end
117
+
118
+ def basic_uploads_json(upload)
119
+ upload.to_json(:only => [:id, :file_name], :methods => [:icon])
120
+ end
121
+
122
+ end
@@ -0,0 +1,17 @@
1
+ module UploaderHelper
2
+
3
+ # parent is the object to which the uploads will be attached
4
+ def upload_form(parent, display_upload_indicators = true)
5
+ render :partial => 'uploads/swf_upload', :locals => {:parent => parent, :display_upload_indicators => display_upload_indicators}
6
+ end
7
+
8
+ def new_upload_path_with_session_information(upload_parent)
9
+ session_key = ActionController::Base.session_options[:key]
10
+ swfupload_uploads_path({session_key => cookies[session_key], request_forgery_protection_token => form_authenticity_token}.merge(make_parent_params(upload_parent)))
11
+ end
12
+
13
+ def make_parent_params(parent)
14
+ { :parent_id => parent.id, :parent_type => parent.class.to_s }
15
+ end
16
+
17
+ end
@@ -0,0 +1,63 @@
1
+ <% content_for :head do -%>
2
+ <%= javascript_include_tag %w{
3
+ swfupload/swfupload.js
4
+ swfupload/swfupload.swfobject
5
+ swfupload/swfupload.cookies
6
+ swfupload/swfupload.queue
7
+ swfupload/fileprogress.js
8
+ swfupload/handlers.js }, :cache => 'swf_js_cached' %>
9
+ <%= stylesheet_link_tag 'swfupload' %>
10
+
11
+ <script type='text/javascript'>
12
+
13
+ var swfu;
14
+
15
+ SWFUpload.onload = function () {
16
+ var settings = {
17
+
18
+ flash_url : '/swf/swfupload.swf',
19
+ upload_url: '<%= new_upload_path_with_session_information(parent) %>',
20
+
21
+ file_size_limit : "100 MB",
22
+ file_types : "*.*",
23
+ file_types_description : "All Files",
24
+ file_upload_limit : 100,
25
+ file_queue_limit : 0,
26
+ post_params : {
27
+ authenticity_token : '<%= u form_authenticity_token.inspect -%>',
28
+ },
29
+ custom_settings : {
30
+ <%= 'progressTarget : "swf_fs_upload_progress",' if display_upload_indicators -%>
31
+ cancelButtonId : "swf_cancel_button"
32
+ },
33
+ debug: false,
34
+
35
+ // Button Settings
36
+ button_image_url : "/images/SWFUploadButton.png", // Relative to the SWF file
37
+ button_placeholder_id : "swf_button_holder",
38
+ button_width: 61,
39
+ button_height: 22,
40
+
41
+ // The event handler functions are defined in handlers.js
42
+ swfupload_loaded_handler : swfUploadLoaded,
43
+ file_queued_handler : fileQueued,
44
+ file_queue_error_handler : fileQueueError,
45
+ file_dialog_complete_handler : fileDialogComplete,
46
+ upload_start_handler : uploadStart,
47
+ upload_progress_handler : uploadProgress,
48
+ upload_error_handler : uploadError,
49
+ upload_success_handler : uploadSuccess,
50
+ upload_complete_handler : uploadComplete,
51
+ queue_complete_handler : queueComplete, // Queue plugin event
52
+
53
+ // SWFObject settings
54
+ minimum_flash_version : "9.0.28",
55
+ swfupload_pre_load_handler : swfUploadPreLoad,
56
+ swfupload_load_failed_handler : swfUploadLoadFailed
57
+ };
58
+
59
+ swfu = new SWFUpload(settings);
60
+ }
61
+
62
+ </script>
63
+ <% end -%>
@@ -0,0 +1,32 @@
1
+ <div id="degraded_container" style="display:none;">
2
+ <% form_for :upload, :url => uploads_path(make_parent_params(parent)), :html => { :multipart => true } do |f| -%>
3
+ <p><%= f.file_field :uploaded_data, :size => 25 %></p>
4
+ <%= submit_tag t('uploader.upload_file') %>
5
+ <% end %>
6
+ </div>
7
+ <div id="swfupload_container">
8
+ <form>
9
+ <div id="swf_upload_UI">
10
+ <p><span id="swf_button_holder"></span></p>
11
+ <div id="swf_fs_upload_progress">
12
+ <span class="legend"></span>
13
+ <input id="swf_cancel_button" type="button" value="<%=t('uploader.cancel_all')%>" style="display:none;" />
14
+ <p id="divStatus"></p>
15
+ </div>
16
+ </div>
17
+ <noscript class="swf-error-msg">
18
+ <%= t('uploader.javascript_not_enabled') %>
19
+ </noscript>
20
+ <div id="swf_loading_content" class="swf-error-msg" style="display:none;">
21
+ <%= t('uploader.swf_loading') %>
22
+ </div>
23
+ <div id="swf_long_loading" class="swf-error-msg" style="display:none;">
24
+ <%= t('uploader.swf_taking_to_long') %>
25
+ </div>
26
+ <div id="swf_alternate_content" class="swf-error-msg" style="display: none;">
27
+ <%= t('uploader.swf_not_loading', :url => '<a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Website</a>') %>
28
+ </div>
29
+ </form>
30
+ </div>
31
+
32
+ <%= render :partial => 'uploads/swf_javascript', :locals => { :parent => parent, :display_upload_indicators => display_upload_indicators } %>
@@ -0,0 +1,3 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.resources :uploads, :controller => 'uploader/uploads', :collection => { :swfupload => :post }
3
+ end
@@ -0,0 +1,38 @@
1
+ class CreateUploads < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :uploads, :force => true do |t|
4
+ t.integer :creator_id
5
+ t.string :name
6
+ t.string :caption, :limit => 1000
7
+ t.text :description
8
+ t.boolean :is_public, :default => true
9
+ t.integer :uploadable_id
10
+ t.string :uploadable_type
11
+ t.string :width
12
+ t.string :height
13
+
14
+ t.string :local_file_name
15
+ t.string :local_content_type
16
+ t.integer :local_file_size
17
+ t.datetime :local_updated_at
18
+
19
+ t.string :remote_file_name
20
+ t.string :remote_content_type
21
+ t.integer :remote_file_size
22
+ t.datetime :remote_updated_at
23
+
24
+ t.timestamps
25
+ end
26
+
27
+ add_index :uploads, ["creator_id"]
28
+ add_index :uploads, ["uploadable_id"]
29
+ add_index :uploads, ["uploadable_type"]
30
+ add_index :uploads, ["local_content_type"]
31
+
32
+ end
33
+
34
+ def self.down
35
+ drop_table :uploads
36
+ end
37
+
38
+ end