uploader 0.1.3 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/README.rdoc +81 -33
  2. data/Rakefile +2 -2
  3. data/TODO +2 -1
  4. data/VERSION +1 -1
  5. data/app/controllers/uploader/uploads_controller.rb +13 -9
  6. data/app/views/uploads/_swf_upload.html.erb +1 -1
  7. data/lib/active_record/acts/uploader_upload.rb +12 -13
  8. data/lib/daemons/amazonaws.rb +36 -0
  9. data/lib/uploader/tasks.rb +9 -3
  10. data/public/images/file_icons/excel.gif +0 -0
  11. data/public/images/file_icons/file.gif +0 -0
  12. data/public/images/file_icons/file.png +0 -0
  13. data/public/images/file_icons/file_aac.gif +0 -0
  14. data/public/images/file_icons/file_ai.gif +0 -0
  15. data/public/images/file_icons/file_avi.gif +0 -0
  16. data/public/images/file_icons/file_bin.gif +0 -0
  17. data/public/images/file_icons/file_bmp.gif +0 -0
  18. data/public/images/file_icons/file_cue.gif +0 -0
  19. data/public/images/file_icons/file_divx.gif +0 -0
  20. data/public/images/file_icons/file_doc.gif +0 -0
  21. data/public/images/file_icons/file_eps.gif +0 -0
  22. data/public/images/file_icons/file_flac.gif +0 -0
  23. data/public/images/file_icons/file_flv.gif +0 -0
  24. data/public/images/file_icons/file_gif.gif +0 -0
  25. data/public/images/file_icons/file_html.gif +0 -0
  26. data/public/images/file_icons/file_ical.gif +0 -0
  27. data/public/images/file_icons/file_indd.gif +0 -0
  28. data/public/images/file_icons/file_inx.gif +0 -0
  29. data/public/images/file_icons/file_iso.gif +0 -0
  30. data/public/images/file_icons/file_jpg.gif +0 -0
  31. data/public/images/file_icons/file_mov.gif +0 -0
  32. data/public/images/file_icons/file_mp3.gif +0 -0
  33. data/public/images/file_icons/file_mpg.gif +0 -0
  34. data/public/images/file_icons/file_pdf.gif +0 -0
  35. data/public/images/file_icons/file_php.gif +0 -0
  36. data/public/images/file_icons/file_png.gif +0 -0
  37. data/public/images/file_icons/file_pps.gif +0 -0
  38. data/public/images/file_icons/file_ppt.gif +0 -0
  39. data/public/images/file_icons/file_psd.gif +0 -0
  40. data/public/images/file_icons/file_qxd.gif +0 -0
  41. data/public/images/file_icons/file_qxp.gif +0 -0
  42. data/public/images/file_icons/file_raw.gif +0 -0
  43. data/public/images/file_icons/file_rtf.gif +0 -0
  44. data/public/images/file_icons/file_svg.gif +0 -0
  45. data/public/images/file_icons/file_tif.gif +0 -0
  46. data/public/images/file_icons/file_txt.gif +0 -0
  47. data/public/images/file_icons/file_vcf.gif +0 -0
  48. data/public/images/file_icons/file_wav.gif +0 -0
  49. data/public/images/file_icons/file_wma.gif +0 -0
  50. data/public/images/file_icons/file_xls.gif +0 -0
  51. data/public/images/file_icons/file_xml.gif +0 -0
  52. data/public/images/file_icons/pdf.gif +0 -0
  53. data/public/images/file_icons/pdf.png +0 -0
  54. data/public/images/file_icons/text.gif +0 -0
  55. data/public/images/file_icons/text.png +0 -0
  56. data/rdoc/classes/ActionController/Routing/RouteSet.html +148 -0
  57. data/rdoc/classes/ActionController/Routing.html +107 -0
  58. data/rdoc/classes/ActionController.html +107 -0
  59. data/rdoc/classes/ActiveRecord/Acts/UploaderUpload/ClassMethods.html +188 -0
  60. data/rdoc/classes/ActiveRecord/Acts/UploaderUpload/InstanceMethods.html +750 -0
  61. data/rdoc/classes/ActiveRecord/Acts/UploaderUpload/SingletonMethods.html +111 -0
  62. data/rdoc/classes/ActiveRecord.html +105 -0
  63. data/rdoc/classes/Uploader/Exceptions/MissingTemplateError.html +111 -0
  64. data/rdoc/classes/Uploader/Exceptions.html +111 -0
  65. data/rdoc/classes/Uploader/FlashSessionCookieMiddleware.html +177 -0
  66. data/rdoc/classes/Uploader/MimeTypeGroups.html +143 -0
  67. data/rdoc/classes/Uploader/Tasks.html +146 -0
  68. data/rdoc/classes/Uploader.html +126 -0
  69. data/rdoc/created.rid +1 -0
  70. data/rdoc/files/README_rdoc.html +427 -0
  71. data/rdoc/files/lib/active_record/acts/uploader_upload_rb.html +101 -0
  72. data/rdoc/files/lib/uploader/exceptions_rb.html +101 -0
  73. data/rdoc/files/lib/uploader/initialize_routes_rb.html +101 -0
  74. data/rdoc/files/lib/uploader/middleware/flash_session_cookie_middleware_rb.html +108 -0
  75. data/rdoc/files/lib/uploader/mime_type_groups_rb.html +101 -0
  76. data/rdoc/files/lib/uploader/tasks_rb.html +110 -0
  77. data/rdoc/files/lib/uploader_rb.html +112 -0
  78. data/rdoc/fr_class_index.html +39 -0
  79. data/rdoc/fr_file_index.html +34 -0
  80. data/rdoc/fr_method_index.html +54 -0
  81. data/rdoc/index.html +24 -0
  82. data/rdoc/rdoc-style.css +208 -0
  83. data/uploader.gemspec +72 -20
  84. metadata +72 -5
  85. data/pkg/uploader-0.1.0.gem +0 -0
  86. data/pkg/uploader-0.1.1.gem +0 -0
  87. data/pkg/uploader-0.1.2.gem +0 -0
data/README.rdoc CHANGED
@@ -17,28 +17,41 @@ sudo gem install uploader
17
17
  config.gem 'uploader'
18
18
 
19
19
 
20
+ === Install jQuery
21
+ uploader uses jQuery. You'll need to include it in your application. Download it here:
22
+ http://jquery.com/
23
+
24
+ Then include it in your layout:
25
+ <%= javascript_include_tag 'jquery/jquery.js' %>
26
+
27
+ Another option is to use jRails
28
+ http://ennerchi.com/projects/jrails
29
+
20
30
  === Create a model for uploads.
21
31
  We recommend creating a model called upload.rb. acts_as_uploader accepts all valid options for paperclip via :has_attached_file => {}
22
32
 
23
33
  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
-
34
+
35
+ acts_as_uploader :enable_s3 => false,
36
+ :has_attached_file => {
37
+ :url => "/system/:attachment/:id_partition/:style/:basename.:extension",
38
+ :path => ":rails_root/public/system/:attachment/:id_partition/:style/:basename.:extension",
39
+ :styles => { :icon => "30x30!",
40
+ :thumb => "100>",
41
+ :small => "150>",
42
+ :medium => "300>",
43
+ :large => "660>" },
44
+ :default_url => "/images/profile_default.jpg",
45
+ :storage => :s3,
46
+ :s3_credentials => AMAZON_S3_CREDENTIALS,
47
+ :bucket => "assets.example.com",
48
+ :s3_host_alias => "assets.example.com",
49
+ :convert_options => {
50
+ :all => '-quality 80'
51
+ }
52
+ },
53
+ :s3_path => ':id_partition/:style/:basename.:extension'
54
+
42
55
  # only allow images:
43
56
  # validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/pjpeg', 'image/jpg']
44
57
 
@@ -97,7 +110,7 @@ controller instead of directly using the one inside the gem:
97
110
 
98
111
  class UploadsController < Uploader::UploadsController
99
112
 
100
- before_filter :login_required
113
+ prepend_before_filter :login_required
101
114
 
102
115
  protected
103
116
 
@@ -123,6 +136,7 @@ controller instead of directly using the one inside the gem:
123
136
 
124
137
  # Simply attempts to redirect to the parent object. You might want to build something more sophisticated that
125
138
  # redirect to different areas of you site depending on the type of object that was uploaded or on based on the parent.
139
+ # source can be :destroy_success, :create_success, :create_failure, :permission_denied
126
140
  def get_redirect
127
141
  @parent
128
142
  end
@@ -143,19 +157,6 @@ controller instead of directly using the one inside the gem:
143
157
 
144
158
  end
145
159
 
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
160
  === Configure your views.
160
161
  You'll need something like this in your layout so that uploader can add in the required css and javascript files.
161
162
 
@@ -209,7 +210,54 @@ Create a file named s3.yml in your configuration directory and add the following
209
210
  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
211
  problem uploader includes a daemon process which will send the files to Amazon asynchronously. Note that the uploader
211
212
  will leave your local copy in place.
212
- TODO docs for Daemon
213
+
214
+ Add the daemons gem and plugin:
215
+ sudo gem install daemons
216
+
217
+ Then inside your Rails project:
218
+ script/plugin install git://github.com/dougal/daemon_generator.git
219
+ script/generate daemon amazonaws
220
+
221
+ RAILS_ENV=development lib/daemons/mailer_ctl start
222
+
223
+ Learn more about the custom daemon gem with Ryan Bates screencast:
224
+ http://railscasts.com/episodes/129-custom-daemon
225
+
226
+
227
+ == Use Rake to send files to s3
228
+ uploader includes a task capable of sending files to s3 but it makes an assumption that the model you are interacting with
229
+ is named 'Upload'.
230
+
231
+ rake uploader:upload_to_s3
232
+
233
+ If you want to use a different model or several models just add a rake task to your project:
234
+
235
+ desc 'Send all uploads to S3. (Will only send uploads from a model named Upload)'
236
+ task :upload_to_s3 do
237
+
238
+ uploads = Upload.pending_s3_migration
239
+ uploads.each do |upload|
240
+ upload.remote = upload.local
241
+ upload.save!
242
+ end
243
+
244
+ photos = Photo.pending_s3_migration
245
+ photos.each do |photo|
246
+ photo.remote = photo.local
247
+ photo.save!
248
+ end
249
+
250
+ end
251
+
252
+ == Setup Domains
253
+ If you use Amazon's S3 service you can setup a cname to clean up your urls. Configure your s3 bucket as above:
254
+
255
+ :bucket => "assets.example.com"
256
+ :s3_host_alias => "assets.example.com"
257
+
258
+ Your assets will be available at assets.example.com.s3.amazon.com. You can then create a CNAME in your DNS entries
259
+ to point "assets.example.com" to "assets.example.com.s3.amazon.com". Your assets will then appear to be
260
+ be served from assets.example.com even though they are loaded from Amazon.
213
261
 
214
262
 
215
263
  == Other Stuff
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
18
18
  rdoc.rdoc_dir = 'rdoc'
19
19
  rdoc.title = 'Uploader'
20
20
  rdoc.options << '--line-numbers' << '--inline-source'
21
- rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('README.rdoc')
22
22
  rdoc.rdoc_files.include('lib/**/*.rb')
23
23
  end
24
24
 
@@ -31,7 +31,7 @@ begin
31
31
  gemspec.homepage = "http://github.com/jbasdf/uploader"
32
32
  gemspec.description = "Uploader gem that makes it simple add multiple file uploads to your Rails project using SWFUpload and Paperclip"
33
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/* )
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
35
  gemspec.rubyforge_project = 'uploader'
36
36
  end
37
37
  rescue LoadError
data/TODO CHANGED
@@ -1,2 +1,3 @@
1
1
  Figure out how to localize javascript files
2
- Write the tests
2
+ Write the tests
3
+ Match up icons with mime types in uploader_upload.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.7
@@ -7,7 +7,7 @@ class Uploader::UploadsController < ApplicationController
7
7
  def create
8
8
  # Standard, one-at-a-time, upload action
9
9
  @upload = @parent.uploads.build(params[:upload])
10
- @upload.creator = current_user
10
+ @upload.creator = get_creator
11
11
  @upload.save!
12
12
  message = t('uploader.successful_upload')
13
13
  upload_json = basic_uploads_json(@upload)
@@ -15,7 +15,7 @@ class Uploader::UploadsController < ApplicationController
15
15
  respond_to do |format|
16
16
  format.html do
17
17
  flash[:notice] = message
18
- redirect_to redirect_back_or_default(get_redirect)
18
+ redirect_to get_redirect(:create_success)
19
19
  end
20
20
  format.js { render :text => get_upload_text(@upload) }
21
21
  format.json { render :json => upload_json }
@@ -25,7 +25,7 @@ class Uploader::UploadsController < ApplicationController
25
25
  respond_to do |format|
26
26
  format.html do
27
27
  flash[:notice] = message
28
- redirect_back_or_default(get_redirect)
28
+ redirect_to get_redirect(:create_failure)
29
29
  end
30
30
  format.js { render :text => message }
31
31
  format.json { render :json => { :success => false, :message => message } }
@@ -35,8 +35,8 @@ class Uploader::UploadsController < ApplicationController
35
35
  def swfupload
36
36
  @upload = @parent.uploads.build
37
37
  @upload.is_public = true if params[:is_public] == true
38
- @upload.creator = current_user
39
- @upload.swfupload_local = params[:Filedata]
38
+ @upload.creator = get_creator
39
+ @upload.swfupload_local = params[:filedata]
40
40
  @upload.save!
41
41
  @parent.uploads << @upload
42
42
  respond_to do |format|
@@ -64,7 +64,7 @@ class Uploader::UploadsController < ApplicationController
64
64
  respond_to do |format|
65
65
  format.html do
66
66
  flash[:notice] = message
67
- redirect_back_or_default(get_redirect)
67
+ redirect_to get_redirect(:destroy_success)
68
68
  end
69
69
  format.js { render :text => message }
70
70
  format.json { render :json => { :success => success, :message => message } }
@@ -86,7 +86,7 @@ class Uploader::UploadsController < ApplicationController
86
86
  respond_to do |format|
87
87
  format.html do
88
88
  flash[:notice] = message
89
- redirect_to get_redirect
89
+ redirect_to get_redirect(:permission_denied)
90
90
  end
91
91
  format.js { render :text => message }
92
92
  format.json { render :json => { :success => false, :message => message } }
@@ -94,8 +94,8 @@ class Uploader::UploadsController < ApplicationController
94
94
  end
95
95
 
96
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
97
+ # source can be :destroy_success, :create_success, :create_failure, :permission_denied
98
+ def get_redirect(source)
99
99
  @parent
100
100
  end
101
101
 
@@ -111,6 +111,10 @@ class Uploader::UploadsController < ApplicationController
111
111
  end
112
112
  end
113
113
 
114
+ def get_creator
115
+ current_user
116
+ end
117
+
114
118
  def has_permission_to_upload(user, upload_parent)
115
119
  upload_parent.can_upload?(user)
116
120
  end
@@ -12,7 +12,7 @@
12
12
  <span class="legend"></span>
13
13
  <input id="swf_cancel_button" type="button" value="<%=t('uploader.cancel_all')%>" style="display:none;" />
14
14
  <p id="divStatus"></p>
15
- </div>
15
+ </div>
16
16
  </div>
17
17
  <noscript class="swf-error-msg">
18
18
  <%= t('uploader.javascript_not_enabled') %>
@@ -26,16 +26,14 @@ module ActiveRecord
26
26
  named_scope :documents, :conditions => "local_content_type IN (#{(Uploader::MimeTypeGroups::WORD_TYPES + Uploader::MimeTypeGroups::EXCEL_TYPES + Uploader::MimeTypeGroups::PDF_TYPES).collect{|type| "'#{type}'"}.join(',')})"
27
27
  named_scope :files, :conditions => "local_content_type NOT IN (#{Uploader::MimeTypeGroups::IMAGE_TYPES.collect{|type| "'#{type}'"}.join(',')})"
28
28
  named_scope :since, lambda { |*args| { :conditions => ["created_at > ?", (args.first || 7.days.ago.to_s(:db)) ]} }
29
- named_scope :pending_s3_migration, lambda {
30
- { :conditions => ["remote_file_name IS NULL AND created_at <= ?", 20.minutes.ago.to_s(:db)],
31
- :order => 'created_at DESC',
32
- :limit => 1 }
33
- }
34
-
29
+ named_scope :pending_s3_migration, lambda { { :conditions => ["remote_file_name IS NULL AND created_at <= ?", 20.minutes.ago.to_s(:db)], :order => 'created_at DESC' } }
30
+
35
31
  # Paperclip
36
32
  has_attached_file :local, options[:has_attached_file].merge(:storage => :filesystem) # Override any storage settings. This one has to be local.
37
33
  if options[:enable_s3] == true
38
- has_attached_file :remote, options[:has_attached_file]
34
+ has_attached_file :remote, options[:has_attached_file].merge(:url => ':s3_alias_url',
35
+ :path => options[:s3_path],
36
+ :storage => :s3)
39
37
  end
40
38
 
41
39
 
@@ -44,6 +42,7 @@ module ActiveRecord
44
42
 
45
43
  class_eval <<-EOV
46
44
  validates_attachment_size :local, :less_than => 10.megabytes
45
+
47
46
  before_post_process :transliterate_file_name
48
47
  before_create :add_width_and_height
49
48
 
@@ -133,19 +132,19 @@ module ActiveRecord
133
132
 
134
133
  def icon
135
134
  if self.is_pdf?
136
- '/images/file_icons/pdf.gif'
135
+ '/images/file_icons/file_pdf.gif'
137
136
  elsif self.is_word?
138
- '/images/file_icons/word.gif'
137
+ '/images/file_icons/file_doc.gif'
139
138
  elsif self.is_image?
140
139
  self.file.url(:icon)
141
140
  elsif self.is_mp3?
142
- '/images/file_icons/mp3.gif'
141
+ '/images/file_icons/file_mp3.gif'
143
142
  elsif self.is_excel?
144
- '/images/file_icons/excel.gif'
143
+ '/images/file_icons/file_xls.gif'
145
144
  elsif self.is_text?
146
- '/images/file_icons/text.gif'
145
+ '/images/file_icons/file_txt.gif'
147
146
  else
148
- '/images/file_icons/file.gif'
147
+ '/images/file_icons/file_raw.gif'
149
148
  end
150
149
  end
151
150
 
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # You might want to change this
4
+ ENV["RAILS_ENV"] ||= "production"
5
+
6
+ require File.dirname(__FILE__) + "/../../config/environment"
7
+
8
+ $running = true
9
+ Signal.trap("TERM") do
10
+ $running = false
11
+ end
12
+
13
+ # Waiting is a timer variable to allow the daemon to restart
14
+ # within two seconds of the Signal rather than using a long
15
+ # sleep command and forcing the daemon to wait.
16
+ $waiting = 0
17
+
18
+ ActiveRecord::Base.logger.info "[AmazonS3] Migration daemon started at #{Time.now}.\n"
19
+
20
+ while($running) do
21
+
22
+ if $waiting < 120
23
+ $waiting += 2
24
+ sleep 2
25
+ else
26
+ $waiting = 0
27
+ upload = Upload.pending_s3_migration.first
28
+
29
+ if upload
30
+ $waiting = 120 - 2
31
+ ActiveRecord::Base.logger.info "[AmazonS3] Migrating upload ##{upload.id}\n"
32
+ upload.remote = upload.local
33
+ upload.save!
34
+ end
35
+ end
36
+ end
@@ -16,17 +16,23 @@ module Uploader
16
16
  Rake::Task[:environment].invoke if defined?(RAILS_ROOT)
17
17
  end
18
18
 
19
- desc 'Send all uploads to S3'
19
+ desc 'Send all uploads to S3. (Will only send uploads from a model named Upload)'
20
20
  task :upload_to_s3 do
21
- # TODO write rake task to upload to s3
21
+ uploads = Upload.pending_s3_migration
22
+ uploads.each do |upload|
23
+ upload.remote = upload.local
24
+ upload.save!
25
+ end
22
26
  end
23
27
 
24
28
  desc "Sync required files from uploader."
25
29
  task :sync do
26
30
  path = File.join(File.dirname(__FILE__), *%w[.. ..])
27
- puts path
31
+ daemons_path = "#{RAILS_ROOT}/lib/daemons"
28
32
  system "rsync -ruv #{path}/public ."
29
33
  system "rsync -ruv #{path}/db ."
34
+ FileUtils.mkdir_p(daemons_path) unless File.directory?(daemons_path)
35
+ FileUtils.cp_r("#{path}/lib/daemons/amazonaws.rb", "#{RAILS_ROOT}/lib/daemons/amazonaws.rb")
30
36
  end
31
37
 
32
38
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file