如何上传图片到火力地堡寄存,如果你只有其URI里面的应用程序?

问题描述 投票:0回答:2

我有一个Android应用程序,它通过Google(或Gmail)的用户授权,我要为每个新用户节省了Google+的头像火力地堡存储,以便使用该应用程序的地方。

我可以通过调用GoogleSignInAccount得到personPhoto = account.getPhotoUrl();化身的URI。

之后,我要上传的头像火力地堡寄存,这样我就可以节省我的火力地堡数据库供用户链接到化身(在这个数据库中的一个字段将持有用户的头像)。

我一直在阅读关于如何上传文件到火力地堡存储this指南。我已经意识到用户的头像不会在手机的‘真正’的存在,但我只有其开放的地方在我的代码。

一个可能的解决方案是化身下载到某个文件夹上的电话,然后用我上面提到的指南。

不过,我不知道如何下载,我想是不是这个问题的最佳解决方案。

什么是这里的选项?

这里是我的onStart方法MainActivity,不工作的代码,因为形象不上手机下载。

protected void onStart() {
        super.onStart();
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        databaseUsers = FirebaseDatabase.getInstance().getReference("users");
        if (account == null) {
            username.setText("Need to sign in");
            email.setText("");
            avatar.setImageResource(android.R.color.transparent);
        }
        else {
            personName = account.getDisplayName();
            personGivenName = account.getGivenName();
            personFamilyName = account.getFamilyName();
            personEmail = account.getEmail();
            personId = account.getId();
            personPhoto = account.getPhotoUrl();
            username.setText(account.getDisplayName());
            email.setText(account.getEmail());
            final String cleanEmail = email.getText().toString().replaceAll("\\.", ",");

            databaseUsers.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                        if (!snapshot.child(cleanEmail).exists()) {
                            mProgress.setMessage("LUL");
                            mProgress.show();
                            mStorage = FirebaseStorage.getInstance().getReference();


                            InputStream stream = null;
                            try {
                                stream = new FileInputStream("some path here");
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            }

                            StorageReference filePath = mStorage.child("Avatar").child(personPhoto.getPath());
                            UploadTask uploadTask = filePath.putStream(stream);
                            uploadTask.addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {
                                    // Handle unsuccessful uploads
                                }
                            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                                    Uri downloadUrl = taskSnapshot.getDownloadUrl();
                                    mProgress.dismiss();
                                }
                            });
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            if(account.getPhotoUrl() != null){
                Picasso.with(this).load(account.getPhotoUrl()).into(avatar);
            }
            else {
                avatar.setImageResource(R.drawable.userdefault);
            }
        }
    }
android firebase authorization firebase-storage
2个回答
0
投票

你可以存储下载的网址,然后将其保存到数据库中的用户/帐户等。在这个例子中,我使用的反应母语。我下载的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))
                })
            })


        })


};

0
投票

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

保存从谷歌在你的数据库获得,当你需要的图像只是去拿URL在执行该URL图像的URL

但是,如果你想下面的图片上传自到火力地堡你如何得到它

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;
    }
}

并上传位图火力检查this

© www.soinside.com 2019 - 2024. All rights reserved.