Хобрук: Ваш путь к мастерству в программировании

Получить URL-адрес загрузки из хранилища Firebase во Flutter

В настоящее время я изучаю Flutter и обнаружил, что во Flutter есть официальный плагин Firebase Storage. firebase_storage У меня есть ссылка на хранилище, подобная этой:

final StorageReference ref = FirebaseStorage.instance.ref().child("default.png");

Но нет способа получить URL-адрес загрузки из этого StorageReference.


  • Как загрузить изображение? Я еще не видел простого способа получить путь загрузки от StorageReference. Я думаю, что в плагине Firebase Storage по-прежнему отсутствуют некоторые функции, позволяющие делать что-то вроде показанного в firebase.google.com/docs/storage/web/download-files 25.01.2018
  • Как упоминал Гюнтер, нет никакого способа получить путь загрузки, прежде чем загрузить изображение. 25.01.2018
  • Зачем тебе это раньше? 25.01.2018
  • Я загрузил изображение вручную из консоли firebase. Всего несколько строк, чтобы обернуть встроенную библиотеку хранилища firebase в канал платформы flutter. Что ж, я сделал это, расширив текущий плагин на свой собственный 28.01.2018
  • Это еще не реализовано, но мы над этим работаем. А пока запросы на включение очень приветствуются. 31.01.2018
  • @CollinJackson Есть ли проблема, на которую я могу подписаться? Как мне следить за прогрессом в этом вопросе? 21.02.2018
  • Я отправил запрос на перенос для этого github.com/flutter/plugins/pull/390/files 21.02.2018

Ответы:


1

Если вышеуказанное решение не работает, попробуйте следующее:

Future<String> uploadImage(var imageFile ) async {
    StorageReference ref = storage.ref().child("/photo.jpg");
    StorageUploadTask uploadTask = ref.putFile(imageFile);

    var dowurl = await (await uploadTask.onComplete).ref.getDownloadURL();
    url = dowurl.toString();

    return url; 
}
18.10.2018
  • Это правильный способ сделать это. Спасибо, приятель, потратил часа два на то, чтобы понять, что за фигня! 04.08.2019
  • Вышеуказанный способ устарел, проверьте этот ответ: stackoverflow.com/a/64764390/7015400 10.11.2020
  • Не могли бы вы проверить мой вопрос, если возможно, stackoverflow .com / questions / 68351097 / 12.07.2021

  • 2

    используйте URL-адрес следующим образом:

    printUrl() async {
        StorageReference ref = 
            FirebaseStorage.instance.ref().child("images/sky.jpg");
        String url = (await ref.getDownloadURL()).toString();
        print(url);
    }
    
    26.09.2018

    3

    Я реализовал метод сохранения вашего изображения с отметкой времени и получения загружаемого URL-адреса.

    Future<String>photoOption() async {
        try {
            DateTime now = new DateTime.now();
            var datestamp = new DateFormat("yyyyMMdd'T'HHmmss");
            String currentdate = datestamp.format(now);
            File imageFile = await ImagePicker.pickImage();
    
    
            StorageReference ref = FirebaseStorage.instance
                .ref()
                .child("images")
                .child("$currentdate.jpg");
            StorageUploadTask uploadTask = ref.putFile(imageFile);
    
            Uri downloadUrl = (await uploadTask.future).downloadUrl;
            addUser.downloadablelink = downloadUrl.toString();
    
            downloadableUrl = downloadUrl.toString();
    
            print(downloadableUrl);
    
        } catch (error) {
            print(error);
        }
    
        return downloadableUrl;
    }
    
    26.02.2018
  • если я хочу загрузить все файлы из папки, могу ли я просто указать имя папки? 11.04.2018
  • stackoverflow.com/questions/37335102/ 14.04.2018
  • put устарел. Используйте putFile. 30.11.2018
  • Геттер future не определен для класса StorageUploadTask. 08.03.2019

  • 4

    В последней версии firebase_storage: ^5.0.1 подход должен быть таким, как показано ниже:

    Reference reference = FirebaseStorage.instance.ref().child("SupportChatImages").child(fileName);
    
        UploadTask uploadTask =  reference.putFile(imageFile);
    
        uploadTask.whenComplete(() async{
    
          try{
            imageUrl = await reference.getDownloadURL();
          }catch(onError){
            print("Error");
          }
    
          print(imageUrl);
    
        });
    
    07.11.2020
  • Большое спасибо за этот ответ! 02.12.2020
  • Здравствуйте, это работает для 1 файла, однако я не уверен, что он работает для списка файлов. Мне нужно сделать что-то вроде `` Future ‹List ‹String›› _uploadFiles (List ‹PickedFile› files) async {`` в предыдущей версии он отлично работает с StorageTaskSnapshot snapshot = await uploadTask.onComplete; из-за ожидания внутри цикла for. 06.12.2020

  • 5

    Мое решение

    Future mainprofile(File image) async {
        try {
          DateTime now = new DateTime.now();
          var datestamp = new DateFormat("yyyyMMdd'T'HHmmss");
          String currentdate = datestamp.format(now);
          _firebaseStorageRef = FirebaseStorage.instance
              .ref()
              .child(userRepository.uid)
              .child('main')
              .child("$currentdate.jpg");
          StorageUploadTask uploadTask = _firebaseStorageRef.putFile(image);
          uploadTask.onComplete.then((onValue) async {
            _mainurl = (await _firebaseStorageRef.getDownloadURL()).toString();
          });
        } catch (error) {
          print(error);
        }
      }
    
    04.09.2019

    6

    Он мое решение:

    StorageReference storageReference = FirebaseStorage.instance.ref().child("myfile"); 
    StorageUploadTask uploadTask = storageReference.putFile(file);
    uploadTask.onComplete.then((s){ 
       s.ref.getDownloadURL(); 
    });
    
    08.07.2019

    7

    Я пробовал много способов, и это сработало для меня после многих попыток удаления старых методов Firebase Storage. Если кто-то получает ошибку 404 Object not found, то приведенный ниже код также решает эту проблему.

    Future<String> uploadSingleImage(File file) async {
        //Set File Name
        String fileName = DateTime.now().millisecondsSinceEpoch.toString() +
            AuthRepository.getUser().uid +
            '.jpg';
        
        //Create Reference
        Reference reference = FirebaseStorage.instance
            .ref()
            .child('Single Post Images')
            .child(fileName);
    
        //Now We have to check the status of UploadTask
        UploadTask uploadTask = reference.putFile(file);
        
        String url;
        await uploadTask.whenComplete(() async {
          url = await uploadTask.snapshot.ref.getDownloadURL();
        });
       
        return url;
      }
    
    08.02.2021

    8

    Вот мое решение

    эта часть - как я получаю изображение из сборщика

     Future getImage() async {
      var image = await ImagePicker.pickImage(source: ImageSource.gallery);
    
      setState(() {
        _image = image;
          print('Image Path $_image');
      });
    }
    

    чем я загружаю это

     Future uploadPic(BuildContext context) async {
    
      String fileName = basename(_image.path);
      StorageReference firebaseStorageRef = FirebaseStorage.instance.ref().child(fileName);
      StorageUploadTask uploadTask = firebaseStorageRef.putFile(_image);
      StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;
    
    
      final String url = (await taskSnapshot.ref.getDownloadURL());
      print('URL Is $url');
    }
    

    надеюсь, это поможет кому-то

    18.04.2020

    9

    Вот мой подход: загрузить изображение в Firebase Storage и получить URL для загрузки

     var img_name=DateTime.now().millisecondsSinceEpoch.toString()+".png";
    
     final StorageReference storageReference = FirebaseStorage.instance.ref().child("images/profile/"+img_name);
    
     var upload= await storageReference.putFile(croppedFile);
     await upload.onComplete;
    
     var url=await storageReference.getDownloadURL();
     print(url.toString());
    
    05.10.2020

    10

    ** Решение для последней версии firebase_storage 9.0.0 **

    Future<void> _uploadImage() async {
    if (_image != null) {
      final fileName = '${DateTime.now()}.jpeg';
      Reference reference = _firebaseStorage.ref('uploads/$fileName');
      TaskSnapshot taskSnapshot = await reference
          .putFile(_image!)
          .whenComplete(() => reference.getDownloadURL());
    
      print(taskSnapshot.ref.fullPath.toString());
    
      setState(() {
        _imageUploadState = ImageUploadState.done;
      });
    }
    

    }

    11.07.2021

    11

    Для firebase_storage: ^ 10.0.1

    Вот код для получения URL загруженного изображения ..

    uploadImagetFirebase(String imagePath) async {
     await FirebaseStorage.instance
      .ref(imagePath)
      .putFile(File(imagePath))
      .then((taskSnapshot) {
    print("task done");
    
    // download url when it is uploaded
    if (taskSnapshot.state == TaskState.success) {
      FirebaseStorage.instance
          .ref(imagePath)
          .getDownloadURL()
          .then((url) {
        print("Here is the URL of Image $url");
        return url;
      }).catchError((onError) {
        print("Got Error $onError");
      });
    }
    });
    }
    
    18.07.2021

    12
  • Вам следует подумать о добавлении текста для объяснения кода в ответе 13.09.2019
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..