【问题标题】:Store image to Firebase storage from cordova camera plugins on Ionic将图像从 Ionic 上的 cordova 相机插件存储到 Firebase 存储
【发布时间】:2016-12-03 07:25:20
【问题描述】:

我已经标记了一些关于该主题的主题(例如:Uploading image to Firebase Storage from Cordova app)但没有找到我的答案...

我正在开发一个 IONIC 项目,该项目使用 ngCordova 相机插件来拍照并从库中获取图片。

所以我得到了一个图像 URI 的结果,我想将它上传到 Firebase 存储中(作为文件或 Blob)。 这是我的代码:

$scope.fromCamera = function() {
 $ionicPlatform.ready(function() {

  var options = {
    quality: 75, 
    destinationType: Camera.DestinationType.FILE_URI,
    sourceType: Camera.PictureSourceType.CAMERA,
    allowEdit: true,
    encodingType: Camera.EncodingType.JPEG, 
    targetWidth: 300, 
    targetHeight: 300, 
    saveToPhotoAlbum: true e
  };

  $cordovaCamera.getPicture(options).then(function(imageURI) { 
    window.resolveLocalFileSystemURL(imageURI, function (fileEntry) {
      fileEntry.file(function (file) {
        var reader = new FileReader();
        reader.onloadend = function () {
          // This blob object can be saved to firebase
          var blob = new Blob([new Uint8Array(this.result)], { type: "image/jpeg" });                  

          // Create the storage ref
          var ref = storageRef.child('images/test');
          // Upload the file
          uploadPhoto(blob, ref);

        };
        reader.readAsArrayBuffer(file);
      });
    }, function (error) {
      console.log(error)
    });
  });

});

};

我读取文件并将其转换为 Blob,然后再将其上传到 Firebase。我收到一个“编码错误”,告诉我“提供给 API 的 URI 格式不正确,或者生成的数据 URL 超出了数据 URL 的 URL 长度限制。”

我正在使用带有 Cordova Mocks 扩展的 chrome 浏览器运行它。

欢迎任何帮助! 谢谢

【问题讨论】:

  • uploadPhoto 中有什么内容?
  • @Aaron Saunders,我的函数 uploadPhoto() 在这里!谢谢您的关注! :)

标签: ionic-framework firebase cordova-plugins ngcordova firebase-storage


【解决方案1】:

uploadPhoto() 是我将文件上传到 firebase 存储的函数(并将 URL 保存在 firebase 数据库中)

var storageRef = Firebase.storageRef();
var databaseRef = Firebase.databaseRef();

var uploadPhoto = function(file, ref) {
  var task = ref.put(file);
  // Update progress bar
  task.on('state_changed', function(snapshot){ 
    // nothing
  }, function(error) {
    // Handle unsuccessful uploads
  }, function() {
    // Handle successful uploads on complete
    $scope.downloadURL = task.snapshot.downloadURL;
    $scope.actualKey = databaseRef.child('posts').push().key;

    databaseRef.child('posts/' + $scope.actualKey).update({
      url : $scope.downloadURL, 
      id : $scope.actualKey,
      time : firebase.database.ServerValue.TIMESTAMP,
    });
  }
);

}

【讨论】:

    【解决方案2】:

    尝试改变...

    [new Uint8Array(this.result)]
    

    就这个

    [this.result]
    

    使用$cordovaFile的替代方法

    var fileName = imageURI.replace(/^.*[\\\/]/, '');
    
    $cordovaFile.readAsArrayBuffer(cordova.file.tempDirectory, fileName)
      .then(function (success) {
        // success - get blob data
        var imageBlob = new Blob([success], { type: "image/jpeg" });
    
          // Create the storage ref
          var ref = storageRef.child('images/test');
          // Upload the file
          uploadPhoto(imageBlob, ref);
    
      }, function (error) {
        // error
      });
    

    我没有从 URI 中获取路径,而是在代码中假设以下内容...

      // modify the image path when on Android
      if ($ionicPlatform.is("android")) {
        path = cordova.file.cacheDirectory
      } else {
        path = cordova.file.tempDirectory
      }
    

    随意解析路径获取目录

    【讨论】:

    • 感谢您的帮助,我会尝试的。视频很完美!
    • 在您的帮助下,它可以工作了!谢谢(我赞成您的回答,但由于我没有足够的“积分”,我不知道它是否有效)。
    • 嗨@Aaron,是否可以对新的cordova使用相同的代码?例如,当我想从这里上传图像时: navigator.camera.getPicture(function cameraSuccess(imageData) {saveToFirebase(imageData,'denemee.png');} 这段代码是否也适用?
    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 2016-09-23
    • 2017-05-16
    • 2016-12-06
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多