You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2016/08/22 08:54:51 UTC

cordova-plugin-file git commit: CB-11699 Read files as Data URLs properly

Repository: cordova-plugin-file
Updated Branches:
  refs/heads/master 21298dce5 -> 3bc494559


CB-11699 Read files as Data URLs properly

When reading file as Data URL, CHUNK_SIZE must be divisible by 3,
otherwise the resultant string made by concatenating chunks will
not be a valid Base64 encoded Data URL.

Also Windows do not support reading sliced files as data URLs, so we
set chunk size equal to file size


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/commit/3bc49455
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/tree/3bc49455
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/diff/3bc49455

Branch: refs/heads/master
Commit: 3bc49455963e873af457a440ea240d5422d01865
Parents: 21298dc
Author: Vladimir Kotikov <ko...@gmail.com>
Authored: Tue Aug 16 11:20:03 2016 +0300
Committer: Vladimir Kotikov <ko...@gmail.com>
Committed: Tue Aug 16 12:02:37 2016 +0300

----------------------------------------------------------------------
 tests/tests.js    | 36 +++++++++++++++++++++++++++++++++++-
 www/FileReader.js | 14 ++++++++++++--
 2 files changed, 47 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/blob/3bc49455/tests/tests.js
----------------------------------------------------------------------
diff --git a/tests/tests.js b/tests/tests.js
index 33688dc..e0a8b3b 100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@ -2469,7 +2469,41 @@ exports.defineAutoTests = function () {
                     },
                     0, -1, largeText);
             });
-       });
+            it("file.spec.94.6 should read large file in multiple chunks, readAsDataURL", function (done) {
+                var largeText = "";
+                for (var i = 0; i < 10; i++) {
+                    largeText += "Test " + i + "\n";
+                }
+
+                // Set the chunk size so that the read will take 5 chunks
+                FileReader.READ_CHUNK_SIZE = Math.floor(largeText.length / 4) + 1;
+
+                var lastProgressValue = 0;
+                var progressFunc = function (evt) {
+                    expect(evt.total).toBeDefined();
+                    expect(evt.total).toEqual(largeText.length);
+
+                    expect(evt.loaded).toBeDefined();
+                    expect(evt.loaded).toBeGreaterThan(lastProgressValue);
+                    expect(evt.loaded).toBeLessThan(evt.total + 1);
+
+                    lastProgressValue = evt.loaded;
+                };
+
+                runReaderTest('readAsDataURL', false, done, progressFunc,
+                    function (evt, fileData, fileDataAsBinaryString) {
+                        expect(function () {
+                            // Cut off data uri prefix
+                            var base64Data = evt.target.result.substring(evt.target.result.indexOf(',') + 1);
+                            expect(window.atob(base64Data)).toEqual(fileData);
+                        }).not.toThrow();
+
+                        expect(lastProgressValue).toEqual(largeText.length);
+                        done();
+                    },
+                undefined, undefined, largeText);
+            });
+        });
         //Read method
         describe('FileWriter', function () {
             it("file.spec.95 should have correct methods", function (done) {

http://git-wip-us.apache.org/repos/asf/cordova-plugin-file/blob/3bc49455/www/FileReader.js
----------------------------------------------------------------------
diff --git a/www/FileReader.js b/www/FileReader.js
index 1b841d8..8d2f086 100644
--- a/www/FileReader.js
+++ b/www/FileReader.js
@@ -121,9 +121,19 @@ function readSuccessCallback(readType, encoding, offset, totalSize, accumulate,
         return;
     }
 
+    var CHUNK_SIZE = FileReader.READ_CHUNK_SIZE;
+    if (readType === 'readAsDataURL') {
+        // Windows proxy does not support reading file slices as Data URLs
+        // so read the whole file at once.
+        CHUNK_SIZE = cordova.platformId === 'windows' ? totalSize :
+            // Calculate new chunk size for data URLs to be multiply of 3
+            // Otherwise concatenated base64 chunks won't be valid base64 data
+            FileReader.READ_CHUNK_SIZE - (FileReader.READ_CHUNK_SIZE % 3) + 3;
+    }
+
     if (typeof r !== "undefined") {
         accumulate(r);
-        this._progress = Math.min(this._progress + FileReader.READ_CHUNK_SIZE, totalSize);
+        this._progress = Math.min(this._progress + CHUNK_SIZE, totalSize);
 
         if (typeof this.onprogress === "function") {
             this.onprogress(new ProgressEvent("progress", {loaded:this._progress, total:totalSize}));
@@ -134,7 +144,7 @@ function readSuccessCallback(readType, encoding, offset, totalSize, accumulate,
         var execArgs = [
             this._localURL,
             offset + this._progress,
-            offset + this._progress + Math.min(totalSize - this._progress, FileReader.READ_CHUNK_SIZE)];
+            offset + this._progress + Math.min(totalSize - this._progress, CHUNK_SIZE)];
         if (encoding) {
             execArgs.splice(1, 0, encoding);
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org