从 Flutter 中的 Firebase 存储获取下载 URL

Posted

技术标签:

【中文标题】从 Flutter 中的 Firebase 存储获取下载 URL【英文标题】:Get Download URL from Firebase Storage in Flutter 【发布时间】: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 平台通道只需几行代码。好吧,我通过将当前插件扩展到我自己的插件来做到这一点 这还没有实现,但我们正在努力。同时非常欢迎拉取请求。 【参考方案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; 

【讨论】:

现在这是正确的做法。谢谢,伙计,花了大约两个小时弄清楚 wtf! 上述方式现已弃用,请查看此答案:***.com/a/64764390/7015400 如果可能的话,请你看看我的问题***.com/questions/68351097/…【参考方案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;

【讨论】:

如果我想从一个文件夹下载所有文件,我可以只提供文件夹名称吗? ***.com/questions/37335102/… 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/..。

【讨论】:

以上是关于从 Flutter 中的 Firebase 存储获取下载 URL的主要内容,如果未能解决你的问题,请参考以下文章

带有 Firebase 托管的 Flutter web 无法从存储中加载图片

从 Flutter Web 应用程序发送 Firebase 存储授权作为 url 参数

从 Firebase 数据快照获取 JSON 键值

Firebase/Flutter - 无法将数据写入数据库

Flutter web:将 CSV 文件存储到 Firebase 存储,无需从计算机上传

无法使用 Flutter Image Network 从 Firebase 存储加载图像