uppy-s3_multipart 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: c747885d4a3c5e57af416694daa5ad809831f42a73e03ea0f72c6be2106bca4b
4
- data.tar.gz: 3dfdb337a8d1ff8f9096018233435d4e3a8b1cc71092ca10fae0582b660e1d1a
3
+ metadata.gz: dfe2ae799d5586b474000ff740cfc72d5e30ab0186098665ff50060693d3fc79
4
+ data.tar.gz: 4748896f3bcaae2f5de3b739e2cf1fe4d99754241165feff92cb4c6a2c92f486
5
5
  SHA512:
6
- metadata.gz: 8366713f060f860ecaaf98177751471a3cbab32bcb4e29414fea742a13bd90ffa6b46845371a10c4deb90273bdfe0a5c5c6db68f579ad6d502f479dcd2fbc4bc
7
- data.tar.gz: e2aa4485b564ba814ddea95b0d77d8872b9afde9baedbd2c0c298cd5434054c2bc56ce6eac48722cddd9719a7bc3f44ccecba696a8f34a1bd86297c72fbec47d
6
+ metadata.gz: 9b4fc57d8a84a1ce4b7444b20d99fc824ce7afe89dc4bb1da81765b24667ca5cacf53b289d8ee336c99530210f96d58ee839b10a425232505b19096007e385fd
7
+ data.tar.gz: 801e7e0f455a23d4db546898ed20b118a642279a7270988ace5cb39e5c15505a57eab6094c8eeb79f4b689ff88854cdfe5315655e105940cfb80ae3164487e6a
data/README.md CHANGED
@@ -15,32 +15,38 @@ gem "uppy-s3_multipart"
15
15
 
16
16
  ## Setup
17
17
 
18
- Once you've created your S3 bucket, you need to set up CORS for it. The
19
- following script sets up minimal CORS configuration needed for multipart
20
- uploads on your bucket using the `aws-sdk-s3` gem:
21
-
22
- ```rb
23
- require "aws-sdk-s3"
24
-
25
- client = Aws::S3::Client.new(
26
- access_key_id: "<YOUR KEY>",
27
- secret_access_key: "<YOUR SECRET>",
28
- region: "<REGION>",
29
- )
30
-
31
- client.put_bucket_cors(
32
- bucket: "<YOUR BUCKET>",
33
- cors_configuration: {
34
- cors_rules: [{
35
- allowed_headers: ["Authorization", "Content-Type", "Origin", "ETag"],
36
- allowed_methods: ["GET", "POST", "PUT", "DELETE"],
37
- allowed_origins: ["*"],
38
- max_age_seconds: 3000,
39
- }]
40
- }
41
- )
18
+ In order to allow direct multipart uploads to your S3 bucket, we need to update
19
+ the bucket's CORS configuration. In the AWS S3 Console go to your bucket, click
20
+ on "Permissions" tab and then on "CORS configuration". There paste in the
21
+ following:
22
+
23
+ ```xml
24
+ <?xml version="1.0" encoding="UTF-8"?>
25
+ <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
26
+ <CORSRule>
27
+ <AllowedOrigin>https://my-app.com</AllowedOrigin>
28
+ <AllowedMethod>GET</AllowedMethod>
29
+ <AllowedMethod>POST</AllowedMethod>
30
+ <AllowedMethod>PUT</AllowedMethod>
31
+ <MaxAgeSeconds>3000</MaxAgeSeconds>
32
+ <AllowedHeader>Authorization</AllowedHeader>
33
+ <AllowedHeader>x-amz-date</AllowedHeader>
34
+ <AllowedHeader>x-amz-content-sha256</AllowedHeader>
35
+ <AllowedHeader>content-type</AllowedHeader>
36
+ <ExposeHeader>ETag</ExposeHeader>
37
+ </CORSRule>
38
+ <CORSRule>
39
+ <AllowedOrigin>*</AllowedOrigin>
40
+ <AllowedMethod>GET</AllowedMethod>
41
+ <MaxAgeSeconds>3000</MaxAgeSeconds>
42
+ </CORSRule>
43
+ </CORSConfiguration>
42
44
  ```
43
45
 
46
+ Replace `https://my-app.com` with the URL to your app (in development you can
47
+ set this to `*`). Once you've hit "Save", it may take some time for the new
48
+ CORS settings to be applied.
49
+
44
50
  ## Usage
45
51
 
46
52
  This gem provides a Rack application that you can mount inside your main
@@ -91,15 +97,32 @@ POST /s3/multipart/:uploadId/complete
91
97
  DELETE /s3/multipart/:uploadId
92
98
  ```
93
99
 
94
- Finally, in your Uppy configuration pass your app's URL as the `serverUrl`:
100
+ Finally, in your Uppy configuration point `serverUrl` to your app's URL:
95
101
 
96
102
  ```js
97
103
  // ...
98
104
  uppy.use(Uppy.AwsS3Multipart, {
99
- serverUrl: "https://your-app.com/",
105
+ serverUrl: '/',
106
+ })
107
+
108
+ uppy.on('upload-success', function (file, data, uploadURL) {
109
+ var uploadedFileData = JSON.stringify({
110
+ id: uploadURL.match(/\/cache\/([^\?]+)/)[1], // extract key without prefix
111
+ storage: 'cache',
112
+ metadata: {
113
+ size: file.size,
114
+ filename: file.name,
115
+ mime_type: file.type,
116
+ }
117
+ })
118
+ // ...
100
119
  })
101
120
  ```
102
121
 
122
+ **See [Adding Direct S3 Uploads] for an example of a complete Uppy setup with
123
+ Shrine. From there you can swap the `presign_endpoint` + `AwsS3` code with the
124
+ `uppy_s3_multipart` + `AwsS3Multipart` setup.**
125
+
103
126
  Both the plugin and method accepts `:options` for specifying additional options
104
127
  to the aws-sdk calls (read further for more details on these options):
105
128
 
@@ -115,9 +138,15 @@ Shrine.uppy_s3_multipart(:cache, options: {
115
138
  })
116
139
  ```
117
140
 
141
+ Note that by default **Shrine won't extract metadata from directly upload
142
+ files**, instead it will just copy metadata that was extracted on the client
143
+ side. See [this section][metadata direct uploads] for the rationale and
144
+ instructions on how to opt in.
145
+
118
146
  ### Standalone
119
147
 
120
- You can also initialize `Uppy::S3Multipart::App` directly:
148
+ You can also use `uppy-s3_multipart` without Shrine. Start by initializing the
149
+ `Uppy::S3Multipart::App` directly:
121
150
 
122
151
  ```rb
123
152
  require "uppy/s3_multipart"
@@ -147,12 +176,12 @@ map "/s3" do
147
176
  end
148
177
  ```
149
178
 
150
- In your Uppy configuration point the `serverUrl` to your application:
179
+ In your Uppy configuration point `serverUrl` to your app's URL:
151
180
 
152
181
  ```js
153
182
  // ...
154
183
  uppy.use(Uppy.AwsS3Multipart, {
155
- serverUrl: "https://your-app.com/",
184
+ serverUrl: '/',
156
185
  })
157
186
  ```
158
187
 
@@ -189,7 +218,7 @@ Initiates a new multipart upload.
189
218
 
190
219
  ```rb
191
220
  client.create_multipart_upload(key: "foo", **options)
192
- #=> { upload_id: "MultipartUploadId", key: "foo" }
221
+ # => { upload_id: "MultipartUploadId", key: "foo" }
193
222
  ```
194
223
 
195
224
  Accepts:
@@ -208,9 +237,9 @@ Retrieves currently uploaded parts of a multipart upload.
208
237
 
209
238
  ```rb
210
239
  client.list_parts(upload_id: "MultipartUploadId", key: "foo", **options)
211
- #=> [ { part_number: 1, size: 5402383, etag: "etag1" },
212
- # { part_number: 2, size: 5982742, etag: "etag2" },
213
- # ... ]
240
+ # => [ { part_number: 1, size: 5402383, etag: "etag1" },
241
+ # { part_number: 2, size: 5982742, etag: "etag2" },
242
+ # ... ]
214
243
  ```
215
244
 
216
245
  Accepts:
@@ -233,7 +262,7 @@ Returns the endpoint that should be used for uploading a new multipart part.
233
262
 
234
263
  ```rb
235
264
  client.prepare_upload_part(upload_id: "MultipartUploadId", key: "foo", part_number: 1, **options)
236
- #=> { url: "https://my-bucket.s3.amazonaws.com/foo?partNumber=1&uploadId=MultipartUploadId&..." }
265
+ # => { url: "https://my-bucket.s3.amazonaws.com/foo?partNumber=1&uploadId=MultipartUploadId&..." }
237
266
  ```
238
267
 
239
268
  Accepts:
@@ -253,7 +282,7 @@ Finalizes the multipart upload and returns URL to the object.
253
282
 
254
283
  ```rb
255
284
  client.complete_multipart_upload(upload_id: upload_id, key: key, parts: [{ part_number: 1, etag: "etag1" }], **options)
256
- #=> { location: "https://my-bucket.s3.amazonaws.com/foo?..." }
285
+ # => { location: "https://my-bucket.s3.amazonaws.com/foo?..." }
257
286
  ```
258
287
 
259
288
  Accepts:
@@ -273,7 +302,7 @@ Aborts the multipart upload, removing all parts uploaded so far.
273
302
 
274
303
  ```rb
275
304
  client.abort_multipart_upload(upload_id: upload_id, key: key, **options)
276
- #=> {}
305
+ # => {}
277
306
  ```
278
307
 
279
308
  Accepts:
@@ -301,9 +330,11 @@ License](https://opensource.org/licenses/MIT).
301
330
 
302
331
  [AwsS3Multipart]: https://uppy.io/docs/aws-s3-multipart/
303
332
  [Shrine]: https://shrinerb.com
333
+ [Adding Direct S3 Uploads]: https://github.com/shrinerb/shrine/wiki/Adding-Direct-S3-Uploads
304
334
  [`Aws::S3::Client#create_multipart_upload`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#create_multipart_upload-instance_method
305
335
  [`Aws::S3::Client#list_parts`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#list_parts-instance_method
306
336
  [`Aws::S3::Client#upload_part`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#upload_part-instance_method
307
337
  [`Aws::S3::Presigner#presigned_url`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Presigner.html#presigned_url-instance_method
308
338
  [`Aws::S3::Client#complete_multipart_upload`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#complete_multipart_upload-instance_method
309
339
  [`Aws::S3::Client#abort_multipart_upload`]: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#abort_multipart_upload-instance_method
340
+ [metadata direct uploads]: https://github.com/shrinerb/shrine/blob/master/doc/metadata.md#direct-uploads
@@ -1,7 +1,5 @@
1
1
  require "uppy/s3_multipart"
2
2
 
3
- require "securerandom"
4
-
5
3
  class Shrine
6
4
  module Plugins
7
5
  module UppyS3Multipart
@@ -13,6 +11,10 @@ class Shrine
13
11
  def uppy_s3_multipart(storage_key, **options)
14
12
  s3 = find_storage(storage_key)
15
13
 
14
+ unless defined?(Shrine::Storage::S3) && s3.is_a?(Shrine::Storage::S3)
15
+ fail Error, "expected storage to be a Shrine::Storage::S3, but was #{s3.inspect}"
16
+ end
17
+
16
18
  ::Uppy::S3Multipart::App.new(
17
19
  bucket: s3.bucket,
18
20
  prefix: s3.prefix,
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = "uppy-s3_multipart"
3
- gem.version = "0.1.0"
3
+ gem.version = "0.1.1"
4
4
 
5
5
  gem.required_ruby_version = ">= 2.2"
6
6
 
@@ -20,5 +20,6 @@ Gem::Specification.new do |gem|
20
20
  gem.add_development_dependency "minitest"
21
21
  gem.add_development_dependency "rack-test_app"
22
22
  gem.add_development_dependency "shrine", "~> 2.0"
23
+ gem.add_development_dependency "shrine-memory"
23
24
  gem.add_development_dependency "aws-sdk-core", "~> 3.23"
24
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uppy-s3_multipart
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-27 00:00:00.000000000 Z
11
+ date: 2018-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: roda
@@ -100,6 +100,20 @@ dependencies:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: '2.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: shrine-memory
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: aws-sdk-core
105
119
  requirement: !ruby/object:Gem::Requirement