来自Firebase存储的颤动加载图像

spo*_*oss 12 dart flutter

我看到有很多关于如何使用flutter上传图像到firebase存储的例子,但没有关于实际下载/读取/显示已经上传的图像的内容.

在Android中,我只是用来Glide显示图像,我如何在Flutter中这样做?我是否使用NetworkImage该类,如果是,我如何首先获取存储在存储中的图像的URL?

Ale*_*hov 12

下面是一个有状态小部件的示例,它从 Firebase Storage 对象加载图像并构建一个 Image 对象:

class _MyHomePageState extends State<MyHomePage> {

  final FirebaseStorage storage = FirebaseStorage(
      app: Firestore.instance.app,
      storageBucket: 'gs://my-project.appspot.com');

  Uint8List imageBytes;
  String errorMsg;

  _MyHomePageState() {
      storage.ref().child('selfies/me2.jpg').getData(10000000).then((data) =>
                setState(() {
                  imageBytes = data;
                })
        ).catchError((e) =>
                setState(() {
                  errorMsg = e.error;
                })
        );
  }

  @override
  Widget build(BuildContext context) {
    var img = imageBytes != null ? Image.memory(
        imageBytes,
        fit: BoxFit.cover,
      ) : Text(errorMsg != null ? errorMsg : "Loading...");

    return new Scaffold(
        appBar: new AppBar(
          title: new Text(widget.title),
        ),
        body: new ListView(
          children: <Widget>[
            img,
          ],
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,FirebaseApp初始化由Firestore类处理,因此不需要进一步的初始化代码。

  • 这应该是公认的答案,非常好。谢谢你!getDownloadURL 创建长期存在的 url,并且 google 还会为创建的每个 url 收取额外费用 (3认同)

Man*_*ath 9

Firebase控制台

要查看存储中的图像,您需要的是存储中文件的名称。获得所需特定图像的文件名后。就我而言,如果我想加载testimage,

final ref = FirebaseStorage.instance.ref().child('testimage');
// no need of the file extension, the name will do fine.
var url = await ref.getDownloadURL();
print(url);
Run Code Online (Sandbox Code Playgroud)

输入网址后,

Image.network(url);
Run Code Online (Sandbox Code Playgroud)

就这样 :)

  • 这不是一个好的解决方案,因为它创建了一个长期存在的 url,因此是一个安全漏洞。来自文档:“使用可撤销令牌异步检索长期存在的下载 URL。这可用于与其他人共享文件,但如果需要,开发人员可以在 Firebase 控制台中撤销。” 所以这基本上就像在 Google Drive 中创建公共链接一样。 (4认同)
  • @janosch我同意你的观点,我希望看到一个无需创建可共享下载链接的解决方案 (2认同)

Gün*_*uer 7

更新

在较新的版本中使用

await ref.getDownloadURL();
Run Code Online (Sandbox Code Playgroud)

请参阅如何从Flutter中的UploadTaskSnapshot获取完整的downloadUrl?

原版的

someMethod() async {
  var data = await FirebaseStorage.instance.ref().child("foo$rand.txt").getData();
  var text = new String.fromCharCodes(data);
  print(data);
}
Run Code Online (Sandbox Code Playgroud)

请参阅从Firebase下载图像到Flutter

要么

final uploadTask = imageStore.putFile(imageFile);
final url = (await uploadTask.future).downloadUrl;
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,您需要存储downloadUrl某处,然后使用NetworkImage或类似地将其渲染.

  • 这不是一个好的解决方案,因为它创建了一个长期存在的 url,因此是一个安全漏洞。来自文档:“使用可撤销令牌异步检索长期存在的下载 URL。这可用于与其他人共享文件,但如果需要,开发人员可以在 Firebase 控制台中撤销。” 所以这基本上就像在 Google Drive 中创建公共链接一样。 (6认同)
  • 感谢您的答复。如果可以下载图像,则可以共享图像或可以共享链接。我真的看不出有什么区别。如果您不希望图像泄露出去,您可能根本不应该允许在服务器上访问它。 (4认同)
  • 我否决了它,因为您没有指出图像的公共网址是通过调用 getDownloadURL() 创建的。很多使用这个解决方案的人可能都没有意识到这一点,所以这是一个非常重要的细节。getDownloadURL 显然不是用于此目的,而是用于有意与其他用户共享文件链接的目的。 (3认同)