1
votes

Android Firebase téléversant des images incorrectes (PROBLÈME: l'en-tête X-Goog-Upload-Comment est manquant)

J'essaye de télécharger et de télécharger des images depuis la base de données Firabase qui a un lien URL vers Firebase Storage. Le problème est que l'URL étrange est en cours d'enregistrement dans la base de données (voir le lien en bas). Que dois-je faire pour obtenir une URL normale que je pourrai utiliser pour télécharger l'image dans mon application Android? Merci d'avance!

Ici, je poste du code que j'utilise:

Télécharger vers Firebase DataBase and Storage:

@Override
public void onBindViewHolder(@NonNull ImageViewHolder imageViewHolder, int i) {

    Upload uploadCurrent = mUploads.get(i);

    imageViewHolder.textViewName.setText(uploadCurrent.getName());

    Picasso.get().load(uploadCurrent.getUrl()).into(imageViewHolder.imageView);
}

Et télécharger depuis Firebase:

databaseReference = FirebaseDatabase.getInstance().getReference();

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for (DataSnapshot postSnapshot : dataSnapshot.getChildren())
        {
            Upload upload = postSnapshot.getValue(Upload.class);
            mUploads.add(upload);
        }

        mAdapter = new AdverisementAdapter(getContext(),mUploads);
        mrecyclerView.setAdapter(mAdapter);
    }

et Picasso pour récupérer l'image:

mStorageRef = FirebaseStorage.getInstance().getReference();
mDataBaseRef = FirebaseDatabase.getInstance().getReference();

if (mImageUri != null)
{
    final StorageReference fileReference = mStorageRef.child(nameimage + "." + getFileExtension(mImageUri));

    fileReference.putFile(mImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

            Toast.makeText(AddAdvertisement.this, "Upload successful!", Toast.LENGTH_LONG).show();

            Upload upload = new Upload(et_localization, taskSnapshot.getUploadSessionUri().toString());
            String uploadId = mDataBaseRef.push().getKey();
            mDataBaseRef.child(uploadId).setValue(upload);


        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(AddAdvertisement.this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

Picasso fonctionne très bien, car sauf forme une image que je reçois également de Firebase chaîne avec le nom, qui est téléchargé de manière appropriée. Donc, le problème, je pense que c'est juste avec cette mauvaise URL:

https://firebasestorage.googleapis.com/v0/b/my_name/o?name=image.jpg&uploadType=resumable&upload_id=AEnB2UrrOhqOVqTHuRRVRmlkf4Gh6y5xd_w5IvRok1SNVOMNnz34dqWFJ5_lPD0DNJr05mrHrT8g97sy0d4BZAdiB6v7skkLSQ&upload_protocol=resumable p> Lorsque j'essaye de saisir ce lien, je reçois ce type d'erreur:

Demande invalide. L'en-tête X-Goog-Upload-Command est manquant.


0 commentaires

4 Réponses :


1
votes

Selon la documentation officielle concernant UploadTask.TaskSnapshot méthode getUploadSessionUri () :

Renvoie l'URI de session, valide pendant environ une semaine, qui peut être utilisé pour reprendre un téléchargement plus tard en passant cette valeur dans putFile (Uri, StorageMetadata, Uri) .

J'ai bien peur que ce ne soit pas l ' Uri que vous recherchez. Pour obtenir l'URI correcte, veuillez consulter ma réponse dans ce message .


1 commentaires

Bonjour, merci pour votre aide, mais une autre réponse a fait le travail.



3
votes

Vous écrivez cette valeur dans la base de données:

fileReference.putFile(mImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

        Toast.makeText(AddAdvertisement.this, "Upload successful!", Toast.LENGTH_LONG).show();

        fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String url = uri.toString();
                Upload upload = new Upload(et_localization, url);
                String uploadId = mDataBaseRef.push().getKey();
                mDataBaseRef.child(uploadId).setValue(upload);
            }
        });

    }
})...

Il s'agit de l'URI de la session de téléchargement, que vous pouvez utiliser pour reprendre un téléchargement en cas d'abandon. p >

Puisque vous souhaitez stocker l'URL de téléchargement, cet appel est assez inutile pour votre cause. Au lieu de cela, vous devez appeler getDownloadUrl () pour obtenir (de manière asynchrone) l'URL de téléchargement du fichier nouvellement téléchargé:

taskSnapshot.getUploadSessionUri().toString()

Notez que ceci est assez bien décrit dans la documentation Firebase sur l'obtention d'une URL de téléchargement après l'importation d'un fichier a >, lequel événement inclut un exemple d'accomplissement de la même chose en utilisant continueWithTask au lieu d'imbriquer des rappels (ce que j'ai fait ci-dessus).


2 commentaires

L'obtention de l'erreur getDownloadUrl () n'est pas prise en charge à la racine du compartiment.


Cela signifie que vous appelez getDownloadUrl () sur une Reference à la racine du bucket. Vous devez l'appeler sur une référence à un fichier spécifique dans ce compartiment. Voir également stackoverflow.com/questions/56933277/...



0
votes

Cela n'a pas fonctionné pour moi (avec Expo), mais avec XMLHttpRequest a fonctionné. J'ai trouvé cette solution ici: https://github.com/expo/ expo / issues / 2402 # issuecomment-443726662

Mon code est ci-dessous, au cas où il pourrait vous aider.

_uploadImageAsync = async (uri) => {
  try {
    const blob = await new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.onload = function () {
        resolve(xhr.response);
      };
      xhr.onerror = function (e) {
        console.log(e);
        reject(new TypeError('Network request failed'));
      };
      xhr.responseType = 'blob';
      xhr.open('GET', uri, true);
      xhr.send(null);
    });

    const ref = firebase
      .storage()
      .ref()
      .child('images/usersPicture/test');
    const snapshot = await ref.put(blob);

    blob.close();

    return await snapshot.ref.getDownloadURL();
  } catch(error) {
    console.log(error)
  }
}


1 commentaires

Merci beaucoup! :-)



1
votes
fileReference.putFile(mImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

        Toast.makeText(AddAdvertisement.this, "Upload successful!", Toast.LENGTH_LONG).show();

        fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                
               // just do your task //like hashmaps to put in

            }
        });

    }
})

0 commentaires