如果您的内部应用只有Uri,如何将图像上传到Firebase存储?

时间:2018-01-01 18:22:52

标签: android firebase authorization firebase-storage

我有一个Android应用程序,它通过Google+(或Gmail)获得用户授权,我希望每个新用户将其Google+头像保存到Firebase存储,以便在应用中使用它。

我可以通过调用data=new HashMap<>();GoogleSignInAccount获取头像的Uri。

之后,我想将头像上传到Firebase存储,因此我可以在我的Firebase数据库中为用户保存该头像的链接(此数据库中的某个字段将保留用户&#39;头像)。

我一直在阅读有关如何将文件上传到Firebase存储的this指南。我已经意识到用户&#39;手机上不存在头像&#34;对于真实&#34;,但我的代码中只有它的Uri。

一种可能的解决方案是将头像下载到手机上的某个文件夹中,然后使用我上面提到的指南。

但是,我不知道如何下载,我认为这不是解决此问题的最佳方法。

这里有什么选择?

以下是personPhoto = account.getPhotoUrl();onStart方法的代码,但由于未在手机上下载头像,因此无效。

MainActivity

2 个答案:

答案 0 :(得分:0)

您可以存储下载URL,然后将其保存到用户/帐户等下的数据库中。在此示例中,我使用react-native。我将下载URL保存到数组中,然后将数组存储到数据库中。

export const userVehiclePhotoUploadRequest = (photos, user, year) => dispatch => {
    console.log('Inside vehiclePhotoUpload Actions', photos, user)

    let referenceToUploadedPhotos = [];

    return new Promise((resolve, reject) => {
        photos.map(ele => {
            let mime = 'application/octet-stream'

            let uri = ele.uri
            let uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri
            let sessionId = new Date().getTime()
            let uploadBlob = null
            let imageRef = firebase.storage().ref('vehicleImages/' + `${user.account.uid}`).child(`${sessionId}`)

            fs.readFile(uploadUri, 'base64')
                .then((data) => {
                    return Blob.build(data, { type: `${mime};BASE64` })
                })
                .then((blob) => {
                    uploadBlob = blob
                    return imageRef.put(blob, { contentType: mime })
                })
                .then(() => {
                    uploadBlob.close()
                    return imageRef.getDownloadURL()
                })
                .then((url) => {
                    referenceToUploadedPhotos.push(url)
                    console.log('ARRAY OF URLS WHILE PUSHING', referenceToUploadedPhotos)
                    resolve(url)
                })
                .catch((error) => {
                    reject(error)
                })
        })
    })
        .then(() => {
            //I did this to not go home until photos are done uploading. 

            let vehicles;
            firebase.database().ref('users/' + user.account.uid + `/allVehicles/allVehiclesArray`).limitToFirst(1).once('value').then(function (snapshot) {
                // ******** This method is straight from their docs ********
                // ******** It returns whatever is found at the path xxxxx/users/user.uid ********
                vehicles = snapshot.val();
            }).then(() => {
                console.log('ARRAY OF URLS BEFORE SETTING', referenceToUploadedPhotos)
                // let lastVehicle = vehicles.length - 1;
                firebase.database().ref('users/' + user.account.uid + `/allVehicles/allVehiclesArray/` + `${Object.keys(vehicles)[0]}` + `/photosReference`).set({
                    referenceToUploadedPhotos
                }).then(() => {
                    dispatch(loginRequest(user.account))
                })
            })


        })


};

答案 1 :(得分:0)

如果您有照片,有效的方法是将照片上传到服务器并获取其URL并将其保存到数据库, 在你的情况下,它已经在服务器(谷歌的服务器)中,为什么你想要再次上传它,而你可以使用它(谷歌的服务器),

将您从Google获得的图片的URL保存在您的数据库中,当您需要图片时,只需获取URL执行URL

但是,如果你想将图片自己上传到Firebase,那么你如何获得它

public Bitmap getBitmapFromURL(String src) {
    try {
        java.net.URL url = new java.net.URL(src);
        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

并将位图上传到Firebase,然后检查this