Flutter Загрузите пакет изображений и получите все эти URL для хранения в Firestore - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь загрузить n фотографий в Firebase Storage и сохранить эти URL в массиве внутри Firestore, но я не могу получить downloadURL(), или я не знаю, где его найти. Я проверил другие ответы, но они были для отдельных файлов, я пытаюсь загрузить пакет и сохранить URL-адреса вместе, вместо загрузки и сохранения URL-адреса в Firestore, и так далее, и так далее ...

КОД:

_uploadImages(String userID, String productID, List<File> images, Function onSuccess(List<String> imageURLs), Function onFailure(String e)) {
    List<String> imageURLs = [];
    int uploadCount = 0;

    StorageReference storeRef = FirebaseStorage.instance.ref().child('Products').child(userID).child(productID).child(uploadCount);
    StorageMetadata metaData = StorageMetadata(contentType: 'image/png');

    images.forEach((image) {
      storeRef.putFile(image, metaData).onComplete.then((snapshot) {
        STUCK AT THIS POINT SINCE THE SNAPSHOT DOESN'T SHOW THE URL OPTION...
        //imageURLs.add(snapshot. )
        uploadCount++;

        if (uploadCount == images.length) {
          onSuccess(imageURLs);
        }
      });
    });
  }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Вы можете использовать этот метод для загрузки нескольких файлов в хранилище Firebase, где List<Asset> активы - это ваши List<File> файлы.

Future<List<String>> uploadImage(
      {@required String fileName, @required List<Asset> assets}) async {
    List<String> uploadUrls = [];

    await Future.wait(assets.map((Asset asset) async {
      ByteData byteData = await asset.requestOriginal();
      List<int> imageData = byteData.buffer.asUint8List();

      StorageReference reference = FirebaseStorage.instance.ref().child(fileName);
      StorageUploadTask uploadTask = reference.putData(imageData);
      StorageTaskSnapshot storageTaskSnapshot;

      // Release the image data
      asset.releaseOriginal();

      StorageTaskSnapshot snapshot = await uploadTask.onComplete;
      if (snapshot.error == null) {
        storageTaskSnapshot = snapshot;
        final String downloadUrl = await storageTaskSnapshot.ref.getDownloadURL();
        uploadUrls.add(downloadUrl);

        print('Upload success');
      } else {
        print('Error from image repo ${snapshot.error.toString()}');
        throw ('This file is not an image');
      }
    }), eagerError: true, cleanUp: (_) {
     print('eager cleaned up');
    });

    return uploadUrls;
}
0 голосов
/ 17 ноября 2018

Попробуйте это (внутри onComplete):

storeRef.getDownloadURL() 
...