s3_file_field 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00afb2600de317ec414528792d3c598e8d945fc7
4
- data.tar.gz: 56bdc45396d2aa291cdebd741c384d2c71b9bfa8
3
+ metadata.gz: 0477893ffeba70b2ce4e91f5ef57dfa5be7097f9
4
+ data.tar.gz: aeee37b0690800a1fa341fdb1435c67f2efd64db
5
5
  SHA512:
6
- metadata.gz: 64472f94db2b2ac849d1ccb56b21572bb51f6e92d933c1d99eb11e7644cea2be0701d917557237d50a3b30d8b6c1cc645fe44a0592e55970beb6a489484b35b8
7
- data.tar.gz: e8d0dd88f0af447594b0fc77a5664b8c6102caad6475b1cc14f497dcdf6fc31510a3f2ca8a695145384029404056ece98881c01aa2375c31c8ba8f178c9256c5
6
+ metadata.gz: 4cc2f163a26a087323d7732e8d0d6c74967f41a6ca18bb36f340fb73b5243de23e00cdd5c908161a21e0b23472ff4a22289d85b40a26554916f8a7c3c4614719
7
+ data.tar.gz: 3f4adacd07301e307c67c2779ca9547ba8cad406174bf435a7609add0deee99baa01939b1a62f6801d5bd8872f6cdc5d6fbd8eed486173c55a80ef6162e78d3d
data/README.md CHANGED
@@ -8,13 +8,15 @@ Note: Since 1.0.2 gem works with both Rails 3 and Rails 4.
8
8
 
9
9
  ## Installation
10
10
 
11
- Add this line to your application's Gemfile:
12
-
11
+ **Gemfile**
13
12
  ```ruby
14
13
  gem 's3_file_field'
15
14
  ```
16
15
 
17
- Then add a new initializer with your AWS credentials:
16
+ **application.coffee**
17
+ ```coffeescript
18
+ #= require s3_file_field
19
+ ```
18
20
 
19
21
  **config/initializers/s3_file_field.rb**
20
22
  ```ruby
@@ -22,9 +24,16 @@ S3FileField.config do |c|
22
24
  c.access_key_id = ENV['AWS_ACCESS_KEY_ID']
23
25
  c.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
24
26
  c.bucket = ENV['AWS_BUCKET']
27
+ # c.acl = "public-read"
28
+ # c.expiration = 10.hours.from_now.utc.iso8601
29
+ # c.max_file_size = 500.megabytes
30
+ # c.conditions = []
31
+ # c.key_starts_with = 'uploads/
25
32
  end
26
33
  ```
27
34
 
35
+ ### S3 configuration
36
+
28
37
  Make sure your AWS S3 CORS Settings for your bucket look like this:
29
38
  ```xml
30
39
  <CORSConfiguration>
@@ -63,31 +72,31 @@ Also ensure you've added `PutObject` and `PutObjectAcl` permission in your bucke
63
72
  }
64
73
  ```
65
74
 
66
- Add the following js to your asset pipeline:
75
+ ## Basic usage
67
76
 
68
- **application.js.coffee**
69
- ```coffeescript
70
- #= require s3_file_field
71
- ```
72
-
73
- ## Usage
74
-
75
- Create a new view that uses the form helper `s3_uploader_form`:
76
77
  ```haml
77
- = form_for :user do |form|
78
- = form.s3_file_field :scrapbook, :class => 'js-s3_file_field'
78
+ = form_for :user do |f|
79
+ = f.s3_file_field :avatar, :class => 'js-s3_file_field'
79
80
  .progress
80
81
  .meter{ :style => "width: 0%" }
81
82
  ```
82
83
 
83
- Then in your application.js.coffee something like:
84
-
85
84
  ```coffeescript
86
85
  jQuery.ready ->
87
- $('.js-s3_file_field').S3FileField()
86
+ $('.js-s3_file_field').S3FileField
87
+ done: (e, data) -> console.log(data.result.url)
88
88
  ```
89
89
 
90
- or
90
+ # Advanced usage
91
+
92
+ ```haml
93
+ = form_for :user do |f|
94
+ = f.s3_file_field :avatar,
95
+ :class => 'js-s3_file_field',
96
+ :key => "/uploads/${timestamp}/${filename}"
97
+ .progress
98
+ .meter{ :style => "width: 0%" }
99
+ ```
91
100
 
92
101
  ```coffeescript
93
102
  ready = ->
@@ -113,20 +122,18 @@ $(document).ready(ready)
113
122
  $(document).on('page:load', ready)
114
123
  ```
115
124
 
116
- Notice that after upload you have to re-fetch file field from DOM by its ID. That's becase
117
- jQuery File Upload clones it somewhere else and `$(this)` reference points to the original input.
118
-
119
-
120
125
  ## Advanced customization
121
126
 
122
127
  You can use any options / API available for jQuery File Upload plugin.
123
128
 
129
+ For full list of options reference [jQuery File Field wiki page](https://github.com/blueimp/jQuery-File-Upload/wiki/Options)
130
+
124
131
  After successful upload, you'll find file data in `data.result` field:
125
132
 
126
133
  ```json
127
134
  {
128
- "filepath": "uploads/v3w3qzcb1d78pvi/something.gif",
129
135
  "url": "https://foobar.s3.amazonaws.com/uploads/v3w3qzcb1d78pvi/something.gif",
136
+ "filepath": "uploads/v3w3qzcb1d78pvi/something.gif",
130
137
  "filename": "something.gif",
131
138
  "filesize": 184387,
132
139
  "filetype": "image\/gif",
@@ -14,92 +14,16 @@ module S3FileField
14
14
  end
15
15
 
16
16
  def s3_file_field(object_name, method, options = {})
17
- uploader = S3Uploader.new(options)
18
- options = options.reverse_merge(uploader.field_options)
17
+ options = S3Uploader.new(options).field_options
18
+
19
19
  if ::Rails.version.to_i >= 4
20
20
  ActionView::Helpers::Tags::FileField.new(
21
21
  object_name, method, self, options
22
22
  ).render
23
23
  else
24
24
  ActionView::Helpers::InstanceTag.new(
25
- object_name, method, self,
26
- options.reverse_merge(uploader.field_options).delete(:object)
27
- ).to_input_field_tag("file", options.update({:size => nil}))
28
- end
29
- end
30
-
31
- class S3Uploader
32
- def initialize(options)
33
- @options = options.reverse_merge(
34
- aws_access_key_id: S3FileField.config.access_key_id,
35
- aws_secret_access_key: S3FileField.config.secret_access_key,
36
- bucket: S3FileField.config.bucket,
37
- acl: "public-read",
38
- expiration: 10.hours.from_now.utc.iso8601,
39
- max_file_size: 500.megabytes,
40
- key_starts_with: options[:key_starts_with] || "uploads/"
41
- )
42
-
43
- unless @options[:aws_access_key_id]
44
- raise Error.new("Please configure aws_access_key_id option.")
45
- end
46
-
47
- unless @options[:aws_secret_access_key]
48
- raise Error.new("Please configure aws_secret_access_key option.")
49
- end
50
-
51
- unless @options[:bucket]
52
- raise Error.new("Please configure bucket name.")
53
- end
54
- end
55
-
56
- def field_options
57
- {
58
- data: {
59
- :url => url,
60
- :key => @options[:key] || key,
61
- :acl => @options[:acl],
62
- :'aws-access-key-id' => @options[:aws_access_key_id],
63
- :policy => policy,
64
- :signature => signature
65
- }.reverse_merge(@options[:data] || {})
66
- }
67
- end
68
-
69
- def key
70
- @key ||= "#{@options[:key_starts_with]}{timestamp}-{unique_id}-#{SecureRandom.hex}/${filename}"
71
- end
72
-
73
- def url
74
- "//#{@options[:bucket]}.s3.amazonaws.com/"
75
- end
76
-
77
- def policy
78
- Base64.encode64(policy_data.to_json).gsub("\n", "")
79
- end
80
-
81
- def policy_data
82
- {
83
- expiration: @options[:expiration],
84
- conditions: [
85
- ["starts-with", "$key", @options[:key_starts_with]],
86
- ["starts-with", "$x-requested-with", ""],
87
- ["content-length-range", 0, @options[:max_file_size]],
88
- ["starts-with","$Content-Type",""],
89
- {bucket: @options[:bucket]},
90
- {acl: @options[:acl]},
91
- {success_action_status: "201"}
92
- ] + (@options[:conditions] || [])
93
- }
94
- end
95
-
96
- def signature
97
- Base64.encode64(
98
- OpenSSL::HMAC.digest(
99
- OpenSSL::Digest::Digest.new('sha1'),
100
- @options[:aws_secret_access_key], policy
101
- )
102
- ).gsub("\n", "")
25
+ object_name, method, self, options.delete(:object)
26
+ ).to_input_field_tag("file", options.update(:size => nil))
103
27
  end
104
28
  end
105
29
  end
@@ -0,0 +1,93 @@
1
+ module S3FileField
2
+ class S3Uploader # :nodoc:
3
+ attr_accessor :options
4
+
5
+ def initialize(original_options = {})
6
+
7
+ default_options = {
8
+ access_key_id: S3FileField.config.access_key_id,
9
+ secret_access_key: S3FileField.config.secret_access_key,
10
+ bucket: S3FileField.config.bucket,
11
+ acl: "public-read",
12
+ expiration: 10.hours.from_now.utc.iso8601,
13
+ max_file_size: 500.megabytes,
14
+ conditions: [],
15
+ key_starts_with: 'uploads/'
16
+ }
17
+
18
+ @key = original_options[:key]
19
+ @original_options = original_options
20
+
21
+ # Remove s3_file_field specific options from original options
22
+ extracted_options = @original_options.extract!(*default_options.keys).
23
+ reject { |k, v| v.nil? }
24
+
25
+ @options = default_options.merge(extracted_options)
26
+
27
+ unless @options[:access_key_id]
28
+ raise Error.new("Please configure access_key_id option.")
29
+ end
30
+
31
+ unless @options[:secret_access_key]
32
+ raise Error.new("Please configure secret_access_key option.")
33
+ end
34
+
35
+ unless @options[:bucket]
36
+ raise Error.new("Please configure bucket name.")
37
+ end
38
+ end
39
+
40
+ def field_options
41
+ @original_options.merge(data: field_data_options)
42
+ end
43
+
44
+ def field_data_options
45
+ {
46
+ url: url,
47
+ key: key,
48
+ acl: @options[:acl],
49
+ aws_access_key_id: @options[:access_key_id],
50
+ policy: policy,
51
+ signature: signature
52
+ }.merge(@options[:data] || {})
53
+ end
54
+
55
+ private
56
+
57
+ def key
58
+ @key ||= "#{@options[:key_starts_with]}{timestamp}-{unique_id}-#{SecureRandom.hex}/${filename}"
59
+ end
60
+
61
+ def url
62
+ "//#{@options[:bucket]}.s3.amazonaws.com/"
63
+ end
64
+
65
+ def policy
66
+ Base64.encode64(policy_data.to_json).gsub("\n", '')
67
+ end
68
+
69
+ def policy_data
70
+ {
71
+ expiration: @options[:expiration],
72
+ conditions: [
73
+ ["starts-with", "$key", @options[:key_starts_with]],
74
+ ["starts-with", "$x-requested-with", ""],
75
+ ["content-length-range", 0, @options[:max_file_size]],
76
+ ["starts-with","$Content-Type",""],
77
+ {bucket: @options[:bucket]},
78
+ {acl: @options[:acl]},
79
+ {success_action_status: "201"}
80
+ ] + @options[:conditions]
81
+ }
82
+ end
83
+
84
+ def signature
85
+ Base64.encode64(
86
+ OpenSSL::HMAC.digest(
87
+ OpenSSL::Digest::Digest.new('sha1'),
88
+ @options[:secret_access_key], policy
89
+ )
90
+ ).gsub("\n", '')
91
+ end
92
+ end
93
+ end
@@ -1,3 +1,3 @@
1
1
  module S3FileField
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
data/lib/s3_file_field.rb CHANGED
@@ -4,8 +4,10 @@ require 'jquery-fileupload-rails'
4
4
  require 'base64'
5
5
  require 'openssl'
6
6
  require 'digest/sha1'
7
+ require 'active_support/core_ext'
7
8
 
8
9
  require 's3_file_field/config_aws'
10
+ require 's3_file_field/s3_uploader'
9
11
  require 's3_file_field/form_helper'
10
12
  require 's3_file_field/railtie'
11
13
  require 's3_file_field/engine'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_file_field
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Stankiewicz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-09 00:00:00.000000000 Z
11
+ date: 2013-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  description: jQuery File Upload extension for direct uploading to Amazon S3 using
98
126
  CORS
99
127
  email:
@@ -106,6 +134,7 @@ files:
106
134
  - lib/s3_file_field/engine.rb
107
135
  - lib/s3_file_field/form_helper.rb
108
136
  - lib/s3_file_field/railtie.rb
137
+ - lib/s3_file_field/s3_uploader.rb
109
138
  - lib/s3_file_field/version.rb
110
139
  - lib/s3_file_field.rb
111
140
  - app/assets/javascripts/s3_file_field.js.coffee