如何使用Javascript将图像副本(位于URL)保存到Firebase存储(Web)?

时间:2016-12-21 15:12:33

标签: javascript firebase firebase-storage

我尝试创建图片副本(位于网址),然后将其保存到Firebase的存储设施中。我想存储实际的图像文件,而不仅仅是网址。如果我理解正确,我首先需要将网址上的图片转换为blob或文件,然后将数据上传到Firebase存储空间。

这是我目前使用Javascript的尝试:

function savePicture(){
    var url = ["http://carltonvet.com.au/sites/default/files/styles/large/public/images/article/cats.jpg"];
    var blobpic = new Blob(url, {type: 'file'}); 
    console.log(blobpic);

    var user = firebase.auth().currentUser;
        if (user != null) {
            var userid = user.uid; 

            var ref = firebase.storage().ref(userid + "profilePhoto");
            ref.put(blobpic).then(function(snapshot) {
                console.log('Picture is uploaded!');
                console.log(snapshot);

                var filePath = snapshot.metadata.fullPath;
                document.getElementById('picTestAddress').innerHTML = ""+filePath;
                document.getElementById('picTestImage').src = ""+filePath;
        });
        }else{
                console.log("Something went wrong, user is null.");
        }
}

我有两个这样的HTML标签:

<div id="picTestAddress"></div>
<img id="picTestImage" />

我非常确定这只是保存网址,而不是物理图片。

&#34; picTestAddress&#34;用"qAjnfi387DHhd389D9j3r/profilePhoto"填写,控制台显示以下错误&#34; picTestImage&#34;:GET file:///android_asset/www/qAjnfi387DHhd389D9j3r/profilePhoto net::ERR_FILE_NOT_FOUND

我使用Firebase for Web和Cordova。我在Android手机上测试应用程序。

我知道错误是因为它在我手机的本地文件系统上查找图像。这对我来说很有意义,所以我想我可以通过将我的应用地址附加到filePath的开头(例如:document.getElementById('picTestImage').src = "https://firebasestorage.googleapis.com/v0/b/MY_APP.appspot.com/o/"+filePath;)来解决这个问题。

要找到正确的路径,我导航到Firebase控制台中的文件位置并复制了&#34;下载网址&#34;地址 - 但是当我检查它(通过将其输入我的网络浏览器)时,它加载了一个白页,其中包含一行文本,这是原始网址:&#34; http://carltonvet.com.au/sites/default/files/styles/large/public/images/article/cats.jpg&#34;

所以现在我认为我已经将网址保存到存储而不是实际的图像文件中。

我一直关注Firebase文档,我认为我的上传部分工作正常,但我认为我在使用Javascript将网址转换为blob /文件时失败了。< / p>

我已经查看了其他一些问题,例如:How to store and view images on firebase?,并且会按照此处的示例进行操作:https://github.com/firebase/firepano但它说它现在已成为传统例如,我似乎无法在Firebase的示例部分找到更新版本。

对于如何做到这一点的任何建议或帮助将非常感激。 先感谢您!

2 个答案:

答案 0 :(得分:4)

看起来不错,不过我也会考虑一个有希望的版本:

function getBlob(url) {
  return new Promise(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function(event){
      var blob = xhr.response;
      resolve(blob);
    };
    xhr.onerror = reject();
    xhr.open('GET', url);
    xhr.send();
  }
}

function storageURLForPhoto(oldURL, newName) {
  getBlob(oldURL)
  .then(function(blob) {
    var picRef = firebase.storage().ref().child(newName);
    return picRef.put(blob)
  })
  .then(function(snapshot) {
    return snapshot.downloadURL;
  });
  .catch(function() {
    // handle any errors
  })
}

更容易推理:)

答案 1 :(得分:3)

以下作品:

function savePhoto(){

    var url = "http://www.planetware.com/photos-large/F/france-paris-eiffel-tower.jpg";
    // First, download the file:
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function(event) {
    var blob = xhr.response;

    // Get the current user:            
    var user = firebase.auth().currentUser;
    if (user != null) {
    var userid = user.uid; 

    // Define where to store the picture:
    var picRef = firebase.storage().ref(userid + "/profilePhoto");

    // Store the picture:
    picRef.put(blob).then(function(snapshot) {
    console.log('Picture uploaded!');

    // Now get image from storage and display in div...
    picRef.getDownloadURL().then(function(pic) {
        var userspic = pic;
        document.getElementById('picTestImage').src = userspic;

    }).catch(function(error) {
        console.log("There was an error: "+error);
    });

    });
    }else{
        console.log("We weren't able to confirm there is a current user, something went wrong.");
    }

  };
  xhr.open('GET', url);
  xhr.send();
}