How to get full downloadUrl from UploadTaskSnapshot in Flutter?
Asked Answered
C

5

14

I correctly receive UploadTaskSnapshot, and the field downloadUrl contains an instance of Uri that parses download link of uploaded file.

How to get storage and downloadUrl as strings?

Cougar answered 18/5, 2018 at 5:26 Comment(0)
C
17

old

final uploadTask = imageStore.putFile(imageFile);
final url = (await uploadTask.future).downloadUrl;

update

This answer https://mcmap.net/q/798700/-how-to-get-full-downloadurl-from-uploadtasksnapshot-in-flutter is now the accurate one.

final ref = FirebaseStorage.instance
    .ref()
    .child('path')
    .child('to')
    .child('the')
    .child('image_filejpg');

ref.putFile(imageFile);
// or ref.putData(Uint8List.fromList(imageData));

var url = await ref.getDownloadURL() as String;

or

var url = Uri.parse(await ref.getDownloadURL() as String);
Coy answered 18/5, 2018 at 5:37 Comment(14)
How to get string url out of that URI that downloadUrl returns.Cougar
var urlString = url.toString() or var urlString = '${url}'Barbell
Uri parses firebase tokens ect.. and I dont know how to get full url. Also, that only answers half of the question. Is there a way to get storage location?Cougar
Thank you, thoughCougar
Why would you need the storage location? That's what you need to have already before you can upload (imageStore.path)Barbell
because as a path I send only relative path, so looks like I need to hardcode base url in the app. I did it that way in the end.Cougar
Path relative to what? I don't get what the actual problem is you're trying to solve.Barbell
when you upload the file you do ` StorageUploadTask putFile = storage.ref().child("region/$fileName").putFile(_regionImage); ` but the actual storage path is "gs://app-db.appspot.com/region/$fileName"; Just thought that I can avoid hardcoding this url. Uri solution worked so thank youCougar
When using it, it indicates the following: The getter 'future' isn't defined for the class StorageUploadTaskYanyanaton
@Yanyanaton try flutter clean. Otherwise I don't know. Doesn't look like the code I posted can produce such an error.Barbell
See new answer belowEuphemize
@GünterZöchbauer: is there any ways to get all file in folder by using flutter ? So far, the answer which I know is NO. I need to get all files by file's name which was stored before. Thanks a lot!Hickson
I don't think so. As far as I know this is also not possible in other languages. This is a Firebase limitation (not sure if this limitation was fixed in Firebase since). When I run into that I used insert and delete triggers with cloud functions to create/delete Firebase database records that point to files to be able to query.Barbell
The above way has been deprecated, to get the url check this answer: https://mcmap.net/q/505965/-undefined-class-storagereference-when-using-firebase-storageYellowwood
P
7

I get downloadUrl from v1.0.3 by the following code.

StorageReference storageReference = _storage.ref().child(path);
StorageUploadTask uploadTask = storageReference.putFile(imageFile);

StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;

String downloadUrl = await taskSnapshot.ref.getDownloadURL();
Petrify answered 6/11, 2018 at 14:59 Comment(0)
E
6

@DomingoMG it looks like with the latest release they want:

String location = await ref.getDownloadURL();

See https://pub.dartlang.org/packages/firebase_storage#-example-tab-

Euphemize answered 7/10, 2018 at 17:6 Comment(2)
What is the ref please explain better, I'm having issues getting the Download URL.Parkway
StorageReference. Go to link and search getDownloadURLEuphemize
U
2

Update: Nov 2020

onComplete is now removed from the upload task. So, use:

var reference = FirebaseStorage.instance.ref().child("your_path");
await reference.putFile(fileToUpload);
var url = await reference.getDownloadURL();
Utta answered 12/11, 2018 at 2:50 Comment(1)
how about getting a list of multi uploaded images?Visor
P
0

With the version of firebase_storage: ^11.0.11. It worked this way:

final FirebaseFirestore firestore = FirebaseFirestore.instance;
  final FirebaseStorage storage = FirebaseStorage.instance;

  DocumentReference get firestoreRef => firestore.doc('products/$id');
  Reference get storageRef => storage.ref().child('products').child(id!);
final UploadTask task = storageRef.child(const Uuid().v1()).putFile(newImage as File);
    final TaskSnapshot snapshot = await task.whenComplete(() {});
    final String url = await snapshot.ref.getDownloadURL();
    updateImages.add(url);

OBS: I'm using package uuid: ^3.0.7 to create a random id for each upload

Pathic answered 23/4, 2023 at 15:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.