【问题标题】:Get Download URL from Firebase Storage in Flutter从 Flutter 中的 Firebase 存储获取下载 URL
【发布时间】:2018-07-04 06:12:49
【问题描述】:

我目前正在探索 Flutter,发现 Flutter 中有一个官方的 Firebase Storage 插件firebase_storage 我有这样的存储参考:

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

但是没有方法可以从该 StorageReference 获取下载 URL。

【问题讨论】:

  • 如何上传图片?我还没有看到从StorageReference 获取下载路径的简单方法。我认为 Firebase 存储插件仍然缺少一些功能,无法执行firebase.google.com/docs/storage/web/download-files 中所示的操作
  • 正如 Gunter 所说,在首先上传图片之前无法获取下载路径。
  • 为什么之前需要它?
  • 我从 firebase 控制台手动上传了图片。将原生 Firebase 存储库包装到 Flutter 平台通道只需几行代码。好吧,我通过将当前插件扩展到我自己的插件来做到这一点
  • 这还没有实现,但我们正在努力。同时非常欢迎拉取请求。

标签: firebase dart firebase-storage flutter


【解决方案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; 
}

【讨论】:

【解决方案2】:

像这样使用网址:

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 如果我想从一个文件夹下载所有文件,我可以只提供文件夹名称吗?
    • put 已弃用。使用putFile
    • 没有为类“StorageUploadTask”定义吸气剂“未来”
    【解决方案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);
    
        });
    

    【讨论】:

    • 非常感谢您的回答!
    • 您好,这适用于 1 个文件,但是我不确定是否可以让它适用于文件列表。我需要做类似 `` Future> _uploadFiles(List files) async {``` 在以前的版本中它与 StorageTaskSnapshot snapshot = await uploadTask.onComplete 一起工作正常;因为 for 循环中的“等待”。
    【解决方案5】:
    Future<String> urlDownload(file) async {
    var uuid = Uuid().v1();
    StorageReference ref =
        FirebaseStorage.instance.ref().child("post_$uuid.jpg");
    StorageUploadTask uploadTask = ref.putFile(file);
    
    String downloadUrl =
        await (await uploadTask.onComplete).ref.getDownloadURL();
    return downloadUrl;}
    

    【讨论】:

    • 你应该考虑添加文字来解释答案中的代码
    【解决方案6】:

    对于 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");
      });
    }
    });
    }
    

    【讨论】:

    • 感谢您对最新版本的回答,我正在寻找这样的东西!
    【解决方案7】:

    他是我的解决方案:

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

    【讨论】:

      【解决方案8】:

      我的解决方案

      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);
          }
        }
      

      【讨论】:

        【解决方案9】:

        我尝试了很多方法,经过多次尝试,这对我有用,因为 Firebase 存储删除了旧方法。如果有人收到 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;
          }
        

        【讨论】:

          【解决方案10】:

          这是我的解决方案

          这部分是我如何从选择器获取图像

           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');
          }
          

          希望对某人有所帮助

          【讨论】:

            【解决方案11】:

            这是我的方法,将图像上传到 Firebase Storage 并获取 dowlad 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());
            

            【讨论】:

              【解决方案12】:

              **最新 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;
                });
              }
              

              }

              【讨论】:

                【解决方案13】:

                对于 firebase_storage:^10.0.1

                import 'package:firebase_storage/firebase_storage.dart' as firebase_storage;
                
                String image = 'gs://ID.appspot.com/image/1026_800x800.jpg';
                
                firebase_storage.FirebaseStorage.instance.refFromURL(image).getDownloadURL().then((url) async {
                                  print(url);
                                });
                

                将下载类似这样的内容:https://firebasestorage.googleapis.com/v0/b/ID.appspot.com/o/..

                【讨论】:

                  猜你喜欢
                  • 2018-12-08
                  • 1970-01-01
                  • 2018-02-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-07-15
                  • 2019-03-13
                  • 2020-12-09
                  • 2020-03-28
                  相关资源
                  最近更新 更多