Firebase Storage v3 gibt unter Android 4.2.2 und 4.3 "Mehrteiliger Körper enthält nicht zwei oder drei Teile" zurück.

Ich erstelle eine Ionic-App für Android 5 und 4. Wenn ich versuche, eine Firebase v3-Speicherreferenz (mithilfe der firebase.js-API) zum Speichern eines Blobs auf Android 4.2.2 und 4.3 zu verwenden, schlägt dies fehl mit:

code: "storage/unknown" 
message: "Firebase Storage: An unknown error occurred, please check the error payload for server response." 
serverResponse: "multipart body does not contain 2 or 3 parts." 
name: "FirebaseError"

Dies funktioniert jedoch problemlos auf Android 5.0.1 und 4.4.2.

Frage Handelt es sich um eine harte Einschränkung der Android-Versionen (oder des enthaltenen Webkits)? Oder eine Inkompatibilität in der firebase.js-API, die ich verwende? Ich versuche zu verstehen, ob das Problem behoben werden kann oder ob nichts getan werden kann.

Der einzige andere Verweis auf diese Fehlermeldung, den ich finden konnte, war hier:https: //github.com/davideast/firebase-react-native-sample/issues/

Aber da dies eine Ionen-Wrapper-App ist, habe ich Zugriff auf den Blob-Typ.

Die Datei wird erstellt, indem ein Bild mit der Erweiterung cordova-plugin-camera aufgenommen und mit Camera.DestinationType.FILE_URI @ im lokalen Speicher des Telefons gespeichert wir

Es wird dann mit der Cordova-Plugin-Dateierweiterung in ein Blob zurückgelesen, bevor es im Firebase-Speicher (insbesondere im von Google Cloud Store unterstützten Speicher, da Firebase v3 verwendet wird) gespeichert wird.

Der Blob scheint erfolgreich erstellt zu werden (obwohl er möglicherweise auf die Verwendung des BlobBuilder zurückgreift, wenn der neue Blob-Konstruktor nicht verfügbar ist - siehe Code-Snippet).

Der relevante Codeabschnitt (innerhalb eines AngularJS-Controllers) sieht folgendermaßen aus:

var makeBlob = function(data, mimeString) {
  try {
    return new Blob([data], {
      type: mimeString
    });
  } catch (err) {
    var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
    var bb = new BlobBuilder();
    bb.append(data);
    return bb.getBlob(mimeString);
  }
};

$scope.uploadLocalImageAsync = function(localImageFileUrl, responseKey, description) {
  var deferred = $q.defer();

  $window.resolveLocalFileSystemURL(localImageFileUrl, function fileEntrySuccess(fileEntry) {
      fileEntry.file(function fileSuccess(file) {
        var reader = new FileReader();
        reader.onloadend = function(evt) {
          try {
            var imageBlob = makeBlob(evt.target.result, 'image/jpeg');
            alert("imageBlob: " + JSON.stringify(imageBlob));

            var metadata = {
              contentType: 'image/jpeg',
              customMetadata: {
                'response': responseKey,
                'description': description
              }
            };

            // Create a root reference
            var storageRef = firebase.storage().ref();
            var fileRef = storageRef.child('images/' + responseKey + '/' + file.name);

            var uploadTask = fileRef.put(imageBlob, metadata);
            uploadTask.on('state_changed', function(snapshot) {
              // Observe state change events such as progress, pause, and resume
              // See below for more detail
              alert(JSON.stringify(snapshot));

            }, function(error) {
              // Handle unsuccessful uploads
              alert(JSON.stringify(error));
              deferred.reject("Upload failed: " + error.code + ": " + error.message)
            }, function() {
              // Handle successful uploads on complete
              // For instance, get the download URL: https://firebasestorage.googleapis.com/...
              var downloadURL = uploadTask.snapshot.downloadURL;
              deferred.resolve({
                gsPath: fileRef.toString(),
                downloadUrl: downloadURL
              });
            });
          } catch (err) {
            deferred.reject("onloadend error: " + err);
          }
        };

        try {
          reader.readAsArrayBuffer(file);
        } catch (err) {
          deferred.reject("readAsArrayBuffer error: " + err);
        }

      }, function fileFailure() {
        deferred.reject("Couldn't make File object");
      });
    },
    function fileEntryFailure() {
      deferred.reject("Couldn't find fileEntry for image");
    });

  return deferred.promise;
};

localImageFileUrl hat die Form "file: ///storage/sdcard0/Android/data/com.ionicframework.myapp/cache/1471426280702.jpg"

Die Funktion gibt tatsächlich ein Versprechen zurück, das später in einem anderen Teil des AngularJS-Controllers aufgelöst wird.

Der Fehler tritt nach dem Starten der uploadTask auf.

Again, dies funktioniert unter Android 5.0.1, 4.4.2, schlägt jedoch unter 4.3, 4.2.2 fehl.

Ich hoffe, es gibt eine zusätzliche Einstellung in Ionic oder etwas, das mir fehlt. Aber ich weiß wirklich nicht, was den Unterschied im Verhalten verursacht oder ob ich irgendetwas dagegen tun kann.

Things ich habe versucht:

Ich habe versucht, die Cordova Android-Plattform auf 3.5 auf Android-17 (4.2.2) herunterzustufen (mit etwas ähnlichem wie hier).https: //stackoverflow.com/a/32672214/672980) erzeugt aber den gleichen Fehler.

(Ich habe auch die verschiedenen Plugins auf die entsprechenden Level herabgestuft)

Einige Informationen zu den Versionen der verwendeten Tools:

ionic info:

Ihre Systeminformationen:

Cordova CLI: 6.3.1
Ionic Framework Version: 1.3.1
Ionic CLI Version: 2.0.0
Ionic App Lib Version: 2.0.0-beta.20
OS:
Node Version: v4.4.7

ionic Plattformversion Android:

Installed platforms:
  android 5.2.1

/ platform / android / AndroidManifest.xml

<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />

/ platform / android / project.properties (und CordovaLib project.properties)

target=android-23

installierte Plugins:

cordova-plugin-camera
cordova-plugin-compat
cordova-plugin-file
cordova-plugin-geolocation
cordova-plugin-whitelist

usinghttps://www.gstatic.com/firebasejs/3.3.0/firebase.js

undhttps://github.com/firebase/angularfire (release v2.0.1)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage