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.
4 Réponses :
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 .
Bonjour, merci pour votre aide, mais une autre réponse a fait le travail.
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).
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/...
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) } }
Merci beaucoup! :-)
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 } }); } })