jquery.fileupload-rails 1.0.0.beta → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Readme.md CHANGED
@@ -23,9 +23,23 @@ Included (no need to require):
23
23
  * jQuery Iframe Transport for IE support.
24
24
  * jQuery UI widget from [jquery-ui-rails][2]
25
25
 
26
+ ## Upgrading 0.1 to 1.0
27
+
28
+ You can remove all dependencies of the plugin from you manifest. Before:
29
+
30
+ //= require jquery.ui
31
+ //= require jquery.iframe-transport
32
+ //= require jquery.fileupload
33
+
34
+ After:
35
+
36
+ //= require jquery.fileupload
37
+
38
+ If you downloaded jquery.ui assets into your project, delete them and use [jquery-ui-rails][2] gem instead.
39
+
26
40
  ## Changelog
27
41
 
28
- 1.0.0.beta. Core 5.17.6.
42
+ 1.0.0. Core 5.18.
29
43
 
30
44
  Now rake task generates assets from official repo and adds dependencies automatically.
31
45
  That means you can just require jquery.fileupload, no extra requires needed.
@@ -6,4 +6,4 @@ $ ->
6
6
  $('#basic').fileupload
7
7
  done: (e, data)->
8
8
  console.log "Done", data.result
9
- $(data.result).find('div').appendTo(this)
9
+ $(data.result).appendTo(this)
@@ -1,22 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "jquery.fileupload-rails/version"
4
2
 
5
3
  Gem::Specification.new do |s|
6
4
  s.name = "jquery.fileupload-rails"
7
- s.version = JqueryFileUpload::Rails::VERSION
8
- s.authors = ["Semyon Perepelitsa"]
9
- s.email = ["sema@sema.in"]
5
+ s.version = "1.0.0"
6
+ s.author = "Semyon Perepelitsa"
7
+ s.email = "sema@sema.in"
10
8
  s.homepage = "https://github.com/semaperepelitsa/jquery.fileupload-rails"
11
9
  s.summary = %q{Use jQuery File Upload plugin with Rails 3}
12
10
  s.description = %q{This gem packages jQuery File Upload plugin and it's dependencies for Rails asset pipeline.}
13
11
 
14
- s.rubyforge_project = "jquery.fileupload-rails"
15
-
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
12
+ s.files = File.read('Manifest.txt').split("\n")
20
13
 
21
14
  s.add_dependency 'sprockets', '~> 2.0'
22
15
  s.add_dependency 'jquery-ui-rails'
@@ -1,4 +1,3 @@
1
- require "jquery.fileupload-rails/version"
2
1
  require "jquery-ui-rails"
3
2
 
4
3
  module JqueryFileUpload
@@ -2,7 +2,7 @@
2
2
  //= require jquery.iframe-transport
3
3
 
4
4
  /*
5
- * jQuery File Upload Plugin 5.17.6
5
+ * jQuery File Upload Plugin 5.18
6
6
  * https://github.com/blueimp/jQuery-File-Upload
7
7
  *
8
8
  * Copyright 2010, Sebastian Tschan
@@ -308,29 +308,18 @@
308
308
  // Ignore non-multipart setting if not supported:
309
309
  multipart = options.multipart || !$.support.xhrFileUpload,
310
310
  paramName = options.paramName[0];
311
- if (!multipart || options.blob) {
312
- // For non-multipart uploads and chunked uploads,
313
- // file meta data is not part of the request body,
314
- // so we transmit this data as part of the HTTP headers.
315
- // For cross domain requests, these headers must be allowed
316
- // via Access-Control-Allow-Headers or removed using
317
- // the beforeSend callback:
318
- options.headers = $.extend(options.headers, {
319
- 'X-File-Name': file.name,
320
- 'X-File-Type': file.type,
321
- 'X-File-Size': file.size
322
- });
323
- if (!options.blob) {
324
- // Non-chunked non-multipart upload:
325
- options.contentType = file.type;
326
- options.data = file;
327
- } else if (!multipart) {
328
- // Chunked non-multipart upload:
329
- options.contentType = 'application/octet-stream';
330
- options.data = options.blob;
331
- }
311
+ options.headers = options.headers || {};
312
+ if (options.contentRange) {
313
+ options.headers['Content-Range'] = options.contentRange;
332
314
  }
333
- if (multipart && $.support.xhrFormDataFileUpload) {
315
+ if (!multipart) {
316
+ // For cross domain requests, the X-File-Name header
317
+ // must be allowed via Access-Control-Allow-Headers
318
+ // or removed using the beforeSend callback:
319
+ options.headers['X-File-Name'] = file.name;
320
+ options.contentType = file.type;
321
+ options.data = options.blob || file;
322
+ } else if ($.support.xhrFormDataFileUpload) {
334
323
  if (options.postMessage) {
335
324
  // window.postMessage does not allow sending FormData
336
325
  // objects, so we just add the File/Blob objects to
@@ -360,6 +349,11 @@
360
349
  });
361
350
  }
362
351
  if (options.blob) {
352
+ // For cross domain requests, the X-File-* headers
353
+ // must be allowed via Access-Control-Allow-Headers
354
+ // or removed using the beforeSend callback:
355
+ options.headers['X-File-Name'] = file.name;
356
+ options.headers['X-File-Type'] = file.type;
363
357
  formData.append(paramName, options.blob, file.name);
364
358
  } else {
365
359
  $.each(options.files, function (index, file) {
@@ -495,6 +489,16 @@
495
489
  return this._enhancePromise(promise);
496
490
  },
497
491
 
492
+ // Parses the Range header from the server response
493
+ // and returns the uploaded bytes:
494
+ _getUploadedBytes: function (jqXHR) {
495
+ var range = jqXHR.getResponseHeader('Range'),
496
+ parts = range && range.split('-'),
497
+ upperBytesPos = parts && parts.length > 1 &&
498
+ parseInt(parts[1], 10);
499
+ return upperBytesPos && upperBytesPos + 1;
500
+ },
501
+
498
502
  // Uploads a file in multiple, sequential requests
499
503
  // by splitting the file up in multiple blob chunks.
500
504
  // If the second parameter is true, only tests if the file
@@ -507,10 +511,10 @@
507
511
  ub = options.uploadedBytes = options.uploadedBytes || 0,
508
512
  mcs = options.maxChunkSize || fs,
509
513
  slice = file.slice || file.webkitSlice || file.mozSlice,
510
- upload,
511
- n,
514
+ dfd = $.Deferred(),
515
+ promise = dfd.promise(),
512
516
  jqXHR,
513
- pipe;
517
+ upload;
514
518
  if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
515
519
  options.data) {
516
520
  return false;
@@ -526,59 +530,63 @@
526
530
  [null, 'error', file.error]
527
531
  );
528
532
  }
529
- // n is the number of blobs to upload,
530
- // calculated via filesize, uploaded bytes and max chunk size:
531
- n = Math.ceil((fs - ub) / mcs);
532
- // The chunk upload method accepting the chunk number as parameter:
533
+ // The chunk upload method:
533
534
  upload = function (i) {
534
- if (!i) {
535
- return that._getXHRPromise(true, options.context);
536
- }
537
- // Upload the blobs in sequential order:
538
- return upload(i -= 1).pipe(function () {
539
- // Clone the options object for each chunk upload:
540
- var o = $.extend({}, options);
541
- o.blob = slice.call(
542
- file,
543
- ub + i * mcs,
544
- ub + (i + 1) * mcs
545
- );
546
- // Expose the chunk index:
547
- o.chunkIndex = i;
548
- // Expose the number of chunks:
549
- o.chunksNumber = n;
550
- // Store the current chunk size, as the blob itself
551
- // will be dereferenced after data processing:
552
- o.chunkSize = o.blob.size;
553
- // Process the upload data (the blob and potential form data):
554
- that._initXHRData(o);
555
- // Add progress listeners for this chunk upload:
556
- that._initProgressListener(o);
557
- jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context))
558
- .done(function () {
559
- // Create a progress event if upload is done and
560
- // no progress event has been invoked for this chunk:
561
- if (!o.loaded) {
562
- that._onProgress($.Event('progress', {
563
- lengthComputable: true,
564
- loaded: o.chunkSize,
565
- total: o.chunkSize
566
- }), o);
567
- }
568
- options.uploadedBytes = o.uploadedBytes +=
569
- o.chunkSize;
570
- });
571
- return jqXHR;
572
- });
535
+ // Clone the options object for each chunk upload:
536
+ var o = $.extend({}, options);
537
+ o.blob = slice.call(
538
+ file,
539
+ ub,
540
+ ub + mcs
541
+ );
542
+ // Store the current chunk size, as the blob itself
543
+ // will be dereferenced after data processing:
544
+ o.chunkSize = o.blob.size;
545
+ // Expose the chunk bytes position range:
546
+ o.contentRange = 'bytes ' + ub + '-' +
547
+ (ub + o.chunkSize - 1) + '/' + fs;
548
+ // Process the upload data (the blob and potential form data):
549
+ that._initXHRData(o);
550
+ // Add progress listeners for this chunk upload:
551
+ that._initProgressListener(o);
552
+ jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context))
553
+ .done(function (result, textStatus, jqXHR) {
554
+ ub = that._getUploadedBytes(jqXHR) ||
555
+ (ub + o.chunkSize);
556
+ // Create a progress event if upload is done and
557
+ // no progress event has been invoked for this chunk:
558
+ if (!o.loaded) {
559
+ that._onProgress($.Event('progress', {
560
+ lengthComputable: true,
561
+ loaded: ub - o.uploadedBytes,
562
+ total: ub - o.uploadedBytes
563
+ }), o);
564
+ }
565
+ options.uploadedBytes = o.uploadedBytes = ub;
566
+ if (ub < fs) {
567
+ // File upload not yet complete,
568
+ // continue with the next chunk:
569
+ upload();
570
+ } else {
571
+ dfd.resolveWith(
572
+ o.context,
573
+ [result, textStatus, jqXHR]
574
+ );
575
+ }
576
+ })
577
+ .fail(function (jqXHR, textStatus, errorThrown) {
578
+ dfd.rejectWith(
579
+ o.context,
580
+ [jqXHR, textStatus, errorThrown]
581
+ );
582
+ });
573
583
  };
574
- // Return the piped Promise object, enhanced with an abort method,
575
- // which is delegated to the jqXHR object of the current upload,
576
- // and jqXHR callbacks mapped to the equivalent Promise methods:
577
- pipe = upload(n);
578
- pipe.abort = function () {
584
+ this._enhancePromise(promise);
585
+ promise.abort = function () {
579
586
  return jqXHR.abort();
580
587
  };
581
- return this._enhancePromise(pipe);
588
+ upload();
589
+ return promise;
582
590
  },
583
591
 
584
592
  _beforeSend: function (e, data) {
@@ -860,8 +868,10 @@
860
868
  var entry;
861
869
  if (item.webkitGetAsEntry) {
862
870
  entry = item.webkitGetAsEntry();
863
- // Workaround for Chrome bug #149735:
864
- entry._file = item.getAsFile();
871
+ if (entry) {
872
+ // Workaround for Chrome bug #149735:
873
+ entry._file = item.getAsFile();
874
+ }
865
875
  return entry;
866
876
  }
867
877
  return item.getAsEntry();
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery.fileupload-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Semyon Perepelitsa
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-05 00:00:00.000000000 Z
12
+ date: 2012-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sprockets
@@ -45,8 +45,7 @@ dependencies:
45
45
  version: '0'
46
46
  description: This gem packages jQuery File Upload plugin and it's dependencies for
47
47
  Rails asset pipeline.
48
- email:
49
- - sema@sema.in
48
+ email: sema@sema.in
50
49
  executables: []
51
50
  extensions: []
52
51
  extra_rdoc_files: []
@@ -108,7 +107,6 @@ files:
108
107
  - dependencies.json
109
108
  - jquery.fileupload-rails.gemspec
110
109
  - lib/jquery.fileupload-rails.rb
111
- - lib/jquery.fileupload-rails/version.rb
112
110
  - vendor/assets/javascripts/jquery.fileupload.js
113
111
  - vendor/assets/javascripts/jquery.iframe-transport.js
114
112
  - vendor/legacy_assets/javascripts/jquery.fileupload-fp.js
@@ -132,11 +130,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
130
  required_rubygems_version: !ruby/object:Gem::Requirement
133
131
  none: false
134
132
  requirements:
135
- - - ! '>'
133
+ - - ! '>='
136
134
  - !ruby/object:Gem::Version
137
- version: 1.3.1
135
+ version: '0'
138
136
  requirements: []
139
- rubyforge_project: jquery.fileupload-rails
137
+ rubyforge_project:
140
138
  rubygems_version: 1.8.23
141
139
  signing_key:
142
140
  specification_version: 3
@@ -1,5 +0,0 @@
1
- module JqueryFileUpload
2
- module Rails
3
- VERSION = "1.0.0.beta"
4
- end
5
- end