glebtv-rails-uploader 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -146
- data/Rakefile +2 -2
- data/app/assets/javascripts/uploader/application.js +5 -6
- data/app/assets/javascripts/uploader/rails_admin.js +6 -25
- data/app/assets/stylesheets/uploader/application.css.sass +2 -0
- data/app/assets/stylesheets/uploader/{application.css → application.css.scss} +0 -0
- data/app/controllers/uploader/attachments_controller.rb +28 -50
- data/app/views/rails_admin/main/_form_rails_uploader.haml +1 -10
- data/app/views/uploader/default/_container.html.erb +49 -64
- data/app/views/uploader/default/_download.html.erb +16 -12
- data/app/views/uploader/default/_upload.html.erb +2 -2
- data/config/routes.rb +1 -5
- data/lib/glebtv-rails-uploader.rb +0 -1
- data/lib/uploader.rb +5 -5
- data/lib/uploader/asset.rb +84 -41
- data/lib/uploader/engine.rb +10 -6
- data/lib/uploader/fileuploads.rb +53 -31
- data/lib/uploader/helpers/field_tag.rb +24 -35
- data/lib/uploader/helpers/form_builder.rb +1 -1
- data/lib/uploader/helpers/form_tag_helper.rb +2 -3
- data/lib/uploader/hooks/formtastic.rb +10 -4
- data/lib/uploader/hooks/simple_form.rb +1 -3
- data/lib/uploader/version.rb +1 -1
- data/spec/dummy/app/models/article.rb +3 -7
- data/spec/dummy/app/models/asset.rb +26 -19
- data/spec/dummy/app/models/picture.rb +4 -4
- data/spec/dummy/config/application.rb +5 -7
- data/spec/dummy/config/environments/development.rb +1 -5
- data/spec/dummy/config/environments/production.rb +0 -4
- data/spec/dummy/config/environments/test.rb +2 -6
- data/spec/dummy/db/migrate/20120508093416_create_assets.rb +3 -1
- data/spec/factories/articles.rb +1 -0
- data/spec/factories/assets.rb +1 -0
- data/spec/fileuploads_spec.rb +2 -2
- data/spec/mongoid_spec.rb +4 -6
- data/spec/requests/attachments_controller_spec.rb +10 -2
- data/spec/spec_helper.rb +7 -3
- data/spec/uploader_spec.rb +1 -1
- data/{app → vendor}/assets/images/uploader/but_del_tag2.png +0 -0
- data/{app → vendor}/assets/images/uploader/ico_attach.png +0 -0
- data/{app → vendor}/assets/images/uploader/preloader.gif +0 -0
- data/{app → vendor}/assets/images/uploader/progressBarFillBg.png +0 -0
- data/vendor/assets/javascripts/uploader/jquery.fileupload-fp.js +8 -4
- data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload-ui.js +219 -44
- data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload.js +16 -74
- data/{app → vendor}/assets/javascripts/uploader/jquery.iframe-transport.js +3 -9
- data/vendor/assets/javascripts/uploader/load-image.min.js +1 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/en.js +0 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/ru.js +0 -0
- data/{app → vendor}/assets/javascripts/uploader/locales/uk.js +0 -0
- data/vendor/assets/javascripts/uploader/tmpl.min.js +1 -0
- data/{app/assets/stylesheets/uploader/default.css → vendor/assets/stylesheets/uploader/default.css.scss} +3 -11
- data/{app/assets/stylesheets/uploader/jquery.fileupload-ui.css → vendor/assets/stylesheets/uploader/jquery.fileupload-ui.css.scss} +0 -0
- metadata +78 -146
- data/app/assets/javascripts/uploader/canvas-to-blob.js +0 -95
- data/app/assets/javascripts/uploader/jquery.fileupload-angular.js +0 -348
- data/app/assets/javascripts/uploader/jquery.fileupload-process.js +0 -158
- data/app/assets/javascripts/uploader/jquery.fileupload-resize.js +0 -212
- data/app/assets/javascripts/uploader/jquery.fileupload-validate.js +0 -116
- data/app/assets/javascripts/uploader/jquery.ui.widget.js +0 -530
- data/app/assets/javascripts/uploader/load-image.js +0 -381
- data/app/assets/javascripts/uploader/tmpl.js +0 -86
- data/lib/file_size_validator.rb +0 -68
- data/spec/dummy/config/mongoid.yml +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9ea7aed1c3dc17e2923dd15546cb0a417b1309d
|
4
|
+
data.tar.gz: 38353c20fc5a4c43a19cbad8f2f8c2b50f8d8bf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c0b5db051449405489eaaa1d65822d1c924a559f431c20cce280b4bd23914a7a4304ddaf27f6dbd980dcb1737d6973b6097ee82a212b88959f0bc413194f8e0
|
7
|
+
data.tar.gz: 55883971815eda043a179e150a78b806321dd6262b71274343c773fc9402413b0c21fd5625798db44c8d9bb58746f52f42010848eaf8310cbecf03579bb8d94e
|
data/README.md
CHANGED
@@ -1,11 +1,4 @@
|
|
1
|
-
|
2
|
-
## ActiveRecord support is dropped!
|
3
|
-
|
4
|
-
This fork works when both simple form and formtastic are loaded
|
5
|
-
|
6
|
-
Also nested associations are working
|
7
|
-
|
8
|
-
## HTML5 File uploader for rails
|
1
|
+
# HTML5 File uploader for rails
|
9
2
|
|
10
3
|
This gem use https://github.com/blueimp/jQuery-File-Upload for upload files.
|
11
4
|
|
@@ -13,12 +6,12 @@ Preview:
|
|
13
6
|
|
14
7
|
![Uploader in use](http://img39.imageshack.us/img39/2206/railsuploader.png)
|
15
8
|
|
16
|
-
|
17
9
|
## Install
|
18
10
|
|
19
11
|
In Gemfile:
|
20
|
-
|
21
|
-
|
12
|
+
|
13
|
+
```
|
14
|
+
gem "rails-uploader"
|
22
15
|
```
|
23
16
|
|
24
17
|
In routes:
|
@@ -27,127 +20,13 @@ In routes:
|
|
27
20
|
mount Uploader::Engine => '/uploader'
|
28
21
|
```
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
### Asset Parent Model (common)
|
33
|
-
``` ruby
|
34
|
-
# models/asset.rb
|
35
|
-
class Asset
|
36
|
-
include Mongoid::Document
|
37
|
-
include Uploader::Asset
|
38
|
-
|
39
|
-
field :guid, type: String
|
40
|
-
belongs_to :assetable, polymorphic: true
|
41
|
-
|
42
|
-
# this workaround is sometimes needed so IDs are ObjectIDs not strings
|
43
|
-
before_save do
|
44
|
-
return true if self.assetable_id.nil? || !self.assetable_id.is_a?(String)
|
45
|
-
if defined?(Moped::BSON)
|
46
|
-
self.assetable_id = Moped::BSON::ObjectId.from_string(self.assetable_id) if Moped::BSON::ObjectId.legal?(self.assetable_id)
|
47
|
-
else
|
48
|
-
self.assetable_id = BSON::ObjectId.from_string(self.assetable_id) if BSON::ObjectId.legal?(self.assetable_id)
|
49
|
-
end
|
50
|
-
true
|
51
|
-
end
|
52
|
-
end
|
53
|
-
```
|
54
|
-
|
55
|
-
### Your asset model
|
56
|
-
``` ruby
|
57
|
-
# models/cover.rb
|
58
|
-
class Cover < Asset
|
59
|
-
# DO NOT add this!
|
60
|
-
# belongs_to :post
|
61
|
-
|
62
|
-
# optional built-in sorting for rails_admin
|
63
|
-
field :sort, type: Integer
|
64
|
-
|
65
|
-
# field name must be 'data'
|
66
|
-
mount_uploader :data, CoverUploader
|
67
|
-
|
68
|
-
validates :data,
|
69
|
-
:presence => true,
|
70
|
-
:file_size => {
|
71
|
-
:maximum => 5.megabytes.to_i
|
72
|
-
}
|
73
|
-
|
74
|
-
def to_jq_upload
|
75
|
-
{
|
76
|
-
'id' => id.to_s,
|
77
|
-
"filename" => File.basename(data.path),
|
78
|
-
"url" => data.url,
|
79
|
-
'thumb_url' => data.thumb.url,
|
80
|
-
}
|
81
|
-
end
|
82
|
-
end
|
83
|
-
```
|
84
|
-
|
85
|
-
### Model to which you want to add assets
|
86
|
-
```ruby
|
87
|
-
# models/post.rb
|
88
|
-
class Post
|
89
|
-
include Mongoid::Document
|
90
|
-
|
91
|
-
field :fileupload_guid, type: String
|
92
|
-
|
93
|
-
include Uploader::Fileuploads
|
94
|
-
has_one :cover, as: :assetable
|
95
|
-
fileuploads :cover
|
96
|
-
end
|
97
|
-
```
|
98
|
-
|
99
|
-
### has_many
|
100
|
-
|
101
|
-
```ruby
|
102
|
-
class Album
|
103
|
-
has_many :pictures, as: :assetable, dependent: :destroy
|
104
|
-
fileuploads :pictures
|
105
|
-
|
106
|
-
accepts_nested_attributes_for :pictures
|
107
|
-
|
108
|
-
rails_admin do
|
109
|
-
edit do
|
110
|
-
...
|
111
|
-
field :fileupload_guid, :hidden # this is needed or else rails_admin sanitizes it away
|
112
|
-
field :pictures, :rails_uploader
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
```
|
118
|
-
|
119
|
-
### CarrierWave uploader - all like usual
|
120
|
-
```ruby
|
121
|
-
# uploades/cover_uploader.rb
|
122
|
-
class CoverUploader < CarrierWave::Uploader::Base
|
123
|
-
include CarrierWave::MiniMagick
|
124
|
-
|
125
|
-
storage :file
|
126
|
-
|
127
|
-
def store_dir
|
128
|
-
"uploads/covers/#{model.id}"
|
129
|
-
end
|
130
|
-
|
131
|
-
version :thumb do
|
132
|
-
process resize_to_limit: [50, 50]
|
133
|
-
end
|
134
|
-
end
|
135
|
-
```
|
136
|
-
|
137
|
-
# Active Admin and RailsAdmin are both working
|
23
|
+
Migration for ActiveRecord:
|
138
24
|
|
139
|
-
|
140
|
-
|
141
|
-
rails_admin do
|
142
|
-
edit do
|
143
|
-
...
|
144
|
-
field :fileupload_guid, :hidden # this is needed or else rails_admin sanitizes it away
|
145
|
-
field :pictures, :rails_uploader
|
146
|
-
end
|
147
|
-
end
|
25
|
+
```bash
|
26
|
+
$> rake uploader:install:migrations
|
148
27
|
```
|
149
28
|
|
150
|
-
## Usage
|
29
|
+
## Usage
|
151
30
|
|
152
31
|
Architecture to store uploaded files (cancan integration):
|
153
32
|
|
@@ -182,6 +61,17 @@ class Picture < Asset
|
|
182
61
|
|
183
62
|
validates_integrity_of :data
|
184
63
|
validates_filesize_of :data, :maximum => 2.megabytes.to_i
|
64
|
+
|
65
|
+
# structure of returned json array of files. (used in Hash.to_json operation)
|
66
|
+
def serializable_hash(options=nil)
|
67
|
+
{
|
68
|
+
"id" => id.to_s,
|
69
|
+
"filename" => File.basename(data.path),
|
70
|
+
"url" => data.url,
|
71
|
+
"thumb_url" => data.url(:thumb),
|
72
|
+
"public_token" => public_token
|
73
|
+
}
|
74
|
+
end
|
185
75
|
end
|
186
76
|
```
|
187
77
|
|
@@ -206,66 +96,78 @@ Find asset by foreign key or guid:
|
|
206
96
|
|
207
97
|
### Mongoid
|
208
98
|
|
99
|
+
No parent asset model is required, one only has to `include Uploader::Asset::Mongoid` into the
|
100
|
+
model that should act like an asset:
|
101
|
+
|
209
102
|
``` ruby
|
210
|
-
class
|
103
|
+
class Picture
|
211
104
|
include Mongoid::Document
|
212
105
|
include Uploader::Asset::Mongoid
|
213
106
|
|
214
|
-
belongs_to :
|
107
|
+
belongs_to :user
|
215
108
|
end
|
216
109
|
|
217
|
-
class
|
218
|
-
|
110
|
+
class User
|
111
|
+
include Mongoid::Document
|
112
|
+
include Uploader::Fileuploads
|
113
|
+
|
114
|
+
has_one :picture, :as => :assetable
|
219
115
|
|
220
|
-
|
116
|
+
fileuploads :picture
|
221
117
|
end
|
118
|
+
```
|
119
|
+
|
120
|
+
### Notice
|
222
121
|
|
122
|
+
User method fileuploads only once pre model. So if you have many attached files, use this:
|
123
|
+
|
124
|
+
``` ruby
|
223
125
|
class User
|
224
|
-
include
|
225
|
-
include Uploader::Fileuploads::Mongoid
|
126
|
+
include Uploader::Fileuploads
|
226
127
|
|
227
|
-
|
128
|
+
has_one :picture, :as => :assetable
|
129
|
+
has_one :avatar, :as => :assetable
|
228
130
|
|
229
|
-
fileuploads :
|
131
|
+
fileuploads :picture, :avatar
|
230
132
|
end
|
231
133
|
```
|
232
134
|
|
135
|
+
|
233
136
|
### Include assets
|
234
137
|
|
235
138
|
Javascripts:
|
236
139
|
|
237
|
-
```
|
238
|
-
//= require jquery.ui.widget
|
140
|
+
```
|
239
141
|
//= require uploader/application
|
240
142
|
```
|
241
143
|
|
242
144
|
Stylesheets:
|
243
145
|
|
244
|
-
```
|
146
|
+
```
|
245
147
|
*= require uploader/application
|
246
148
|
```
|
247
149
|
|
248
150
|
### Views
|
249
151
|
|
250
|
-
```
|
152
|
+
```erb
|
251
153
|
<%= uploader_field_tag :article, :photo %>
|
252
154
|
```
|
253
155
|
|
254
156
|
or FormBuilder:
|
255
157
|
|
256
|
-
```
|
158
|
+
```erb
|
257
159
|
<%= form.uploader_field :photo, :sortable => true %>
|
258
160
|
```
|
259
161
|
|
260
162
|
### Formtastic
|
261
163
|
|
262
|
-
```
|
164
|
+
```erb
|
263
165
|
<%= f.input :pictures, :as => :uploader %>
|
264
166
|
```
|
265
167
|
|
266
168
|
### SimpleForm
|
267
169
|
|
268
|
-
```
|
170
|
+
```erb
|
269
171
|
<%= f.input :pictures, :as => :uploader, :input_html => {:sortable => true} %>
|
270
172
|
```
|
271
173
|
|
@@ -273,7 +175,7 @@ or FormBuilder:
|
|
273
175
|
|
274
176
|
This is only working in Formtastic and FormBuilder:
|
275
177
|
|
276
|
-
```
|
178
|
+
``` erb
|
277
179
|
# formtastic
|
278
180
|
<%= f.input :picture, :as => :uploader, :confirm_delete => true %>
|
279
181
|
# the i18n lookup key would be en.formtastic.delete_confirmations.picture
|
data/Rakefile
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'bundler/gem_tasks'
|
3
|
-
|
4
2
|
require 'rake'
|
5
3
|
require 'rake/testtask'
|
6
4
|
require 'rdoc/task'
|
@@ -24,3 +22,5 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
24
22
|
rdoc.rdoc_files.include('README.rdoc')
|
25
23
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
26
24
|
end
|
25
|
+
|
26
|
+
require "bundler/gem_tasks"
|
@@ -1,9 +1,8 @@
|
|
1
|
-
//= require uploader/
|
2
|
-
//= require uploader/
|
3
|
-
//= require uploader/
|
1
|
+
//= require uploader/jquery.ui.widget
|
2
|
+
//= require uploader/locales/en
|
3
|
+
//= require uploader/tmpl.min
|
4
|
+
//= require uploader/load-image.min
|
5
|
+
//= require uploader/jquery.iframe-transport
|
4
6
|
//= require uploader/jquery.fileupload
|
5
|
-
//= require uploader/jquery.fileupload-process
|
6
|
-
//= require uploader/jquery.fileupload-resize
|
7
|
-
//= require uploader/jquery.fileupload-validate
|
8
7
|
//= require uploader/jquery.fileupload-ui
|
9
8
|
|
@@ -1,27 +1,8 @@
|
|
1
|
-
//= require uploader/
|
2
|
-
//= require uploader/
|
3
|
-
//= require uploader/
|
1
|
+
//= require uploader/jquery.ui.widget
|
2
|
+
//= require uploader/jquery.ui.sortable
|
3
|
+
//= require uploader/locales/en
|
4
|
+
//= require uploader/tmpl.min
|
5
|
+
//= require uploader/load-image.min
|
6
|
+
//= require uploader/jquery.iframe-transport
|
4
7
|
//= require uploader/jquery.fileupload
|
5
|
-
//= require uploader/jquery.fileupload-process
|
6
|
-
//= require uploader/jquery.fileupload-resize
|
7
|
-
//= require uploader/jquery.fileupload-validate
|
8
8
|
//= require uploader/jquery.fileupload-ui
|
9
|
-
|
10
|
-
$(document).off('init.sort').on('init.sort', '.uploader-files', function() {
|
11
|
-
var $t = $(this);
|
12
|
-
$t.sortable({
|
13
|
-
update: function(event, ui) {
|
14
|
-
var sort = [];
|
15
|
-
$t.children().each(function() {
|
16
|
-
sort.push($(this).data('id'));
|
17
|
-
});
|
18
|
-
$.ajax({
|
19
|
-
type: 'POST',
|
20
|
-
url: $t.data('sortPath'),
|
21
|
-
data: {sort: sort.join('|')}
|
22
|
-
})
|
23
|
-
}
|
24
|
-
})
|
25
|
-
});
|
26
|
-
|
27
|
-
$('.uploader-dnd-area input[type=file]').trigger("init.uploader");
|
File without changes
|
@@ -1,79 +1,57 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
module Uploader
|
3
2
|
class AttachmentsController < ActionController::Metal
|
4
3
|
include AbstractController::Callbacks
|
5
|
-
|
4
|
+
|
6
5
|
before_filter :find_klass
|
7
|
-
|
6
|
+
before_filter :find_asset, :only => [:destroy]
|
7
|
+
|
8
8
|
def create
|
9
9
|
@asset = @klass.new(params[:asset])
|
10
10
|
@asset.uploader_create(params, request)
|
11
11
|
render_resourse(@asset, 201)
|
12
12
|
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
@assets = Array.wrap(params[:assets] || [])
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
@asset = @klass.find(params[:id])
|
17
|
-
rescue
|
18
|
-
@asset = @klass.where(guid: params[:guid])
|
19
|
-
end
|
20
|
-
@asset.uploader_destroy(params, request)
|
21
|
-
render_resourse(@asset, 200)
|
22
|
-
end
|
23
|
-
|
24
|
-
def sort
|
25
|
-
@model = params[:assetable_type].safe_constantize
|
26
|
-
|
27
|
-
sort = params[:sort].split('|')
|
28
|
-
if params[:assetable_id].blank?
|
29
|
-
@finder = @klass.where(guid: params[:guid])
|
30
|
-
else
|
31
|
-
@finder = @klass.where(assetable_id: params[:assetable_id])
|
17
|
+
@assets.each_with_index do |id, index|
|
18
|
+
@klass.where(:id => id).update_all(:sort => index)
|
32
19
|
end
|
33
20
|
|
34
|
-
|
35
|
-
if asset.respond_to?(:sort=)
|
36
|
-
asset.sort = sort.index(asset.id.to_s)
|
37
|
-
asset.save!
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
self.status = 200
|
42
|
-
self.content_type = "application/json"
|
43
|
-
self.response_body = '{"ok": true}'
|
21
|
+
render_json({files: []})
|
44
22
|
end
|
45
23
|
|
24
|
+
def destroy
|
25
|
+
@asset.uploader_destroy(params, request)
|
26
|
+
render_json({success: true})
|
27
|
+
end
|
28
|
+
|
46
29
|
protected
|
47
|
-
|
48
|
-
|
49
|
-
def airbrake_request_data
|
50
|
-
{
|
51
|
-
:controller => params[:controller],
|
52
|
-
:action => params[:action],
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
30
|
+
|
56
31
|
def find_klass
|
57
|
-
@klass =
|
32
|
+
@klass = Uploader.constantize(params[:klass])
|
58
33
|
raise ActionController::RoutingError.new("Class not found #{params[:klass]}") if @klass.nil?
|
59
34
|
end
|
60
35
|
|
36
|
+
def find_asset
|
37
|
+
@asset = @klass.where(:public_token => params[:id]).first
|
38
|
+
raise ActionController::RoutingError.new("Asset not found by guid #{params[:id]}") if @asset.nil?
|
39
|
+
end
|
40
|
+
|
61
41
|
def render_resourse(record, status = 200)
|
62
42
|
if record.errors.empty?
|
63
|
-
|
64
|
-
render_json({'files' => Array.wrap(record.to_jq_upload)}.to_json, status)
|
65
|
-
else
|
66
|
-
render_json({'files' => Array.wrap(record)}.to_json, status)
|
67
|
-
end
|
43
|
+
render_json({:files => [record.to_jq_upload]}, status)
|
68
44
|
else
|
69
|
-
render_json(
|
45
|
+
render_json(record.errors, 422)
|
70
46
|
end
|
71
47
|
end
|
48
|
+
|
49
|
+
def render_json(hash_or_object, status = 200)
|
50
|
+
ctype = env["HTTP_USER_AGENT"] && env["HTTP_USER_AGENT"].include?("Android") ? "text/plain" : "application/json"
|
72
51
|
|
73
|
-
def render_json(body, status = 200)
|
74
52
|
self.status = status
|
75
|
-
self.content_type =
|
76
|
-
self.response_body =
|
53
|
+
self.content_type = ctype
|
54
|
+
self.response_body = hash_or_object.to_json(:root => false)
|
77
55
|
end
|
78
56
|
end
|
79
57
|
end
|