如何将图像文件上传到Firebase Storage并在Flutter Web应用程序中显示

wqlqzqxt  于 2022-12-14  发布在  Flutter
关注(0)|答案(3)|浏览(148)

祝你愉快,
我正在实现一个功能,用户可以上传他们的图片到我的Flutter Web应用程序和应用程序显示它。
我试着把它做成下面的样子
1.当用户上传图像文件时,它会以字节的形式上传到Firebase Storage上(我知道图像文件本身不能通过Flutter WEB应用程序上传,必须转换为字节。真的吗?)
1.字节文件的下载URL存储在Firestore中。
1.我的应用会找到下载URL,并使用该URL显示图像文件(字节)(如果是)。
使用的方法是Image.network(downloadURL),但URL中的文件似乎必须是图像文件,否则会引发错误。
我想知道如何在Flutter WEB应用程序中显示从下载URL转换为字节的图像文件。
或者将图像文件本身上传到Flutter WEB应用程序中的Firebase Storage。

应用程序找到具有以下代码的下载URL

String? profileDownloadURL;

  @override
  initState() {
    super.initState();
    email = FirebaseAuth.instance.currentUser!.email;
    getProfileURL();
  }

  getProfileURL() async {
    DocumentSnapshot<Map<String, dynamic>> documentSnapshot =
        await FirebaseFirestore.instance.collection('Users').doc(email).get();
    setState(() {
      profileDownloadURL = documentSnapshot.data()!['profileDownloadURL'];
    });

    print('profile: $profileDownloadURL');
  }

用户可以使用以下方法选择图像文件

startWebFilePicker() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles();
    if (result != null) {
      final email = FirebaseAuth.instance.currentUser!.email;
      final storageRef = FirebaseStorage.instance.ref();
      final profileRef = storageRef.child(email!).child(result.files.single.name);
      try {
        // upload a byte-converted image file to Firebase Storage
        await profileRef.putData(result.files.single.bytes!);
        // update download URL on Firestore
        String downloadURL = await profileRef.getDownloadURL();
        FirebaseFirestore.instance.collection('Users').doc(email).set(
          {'profileDownloadURL': downloadURL},
          SetOptions(merge: true),
        );
      } on FirebaseException catch (e) {
        print('1: $e');
      } catch (e) {
        print('2: $e');
      }
    } else {
      // User canceled the picker
    }
  }

应用程序显示如下图像

Container(
  child: profileDownloadURL != null
    ? CircleAvatar(
        radius: 100,
        backgroundImage: Image.network(
          profileDownloadURL!,
          fit: BoxFit.fill,
        ).image,
      )
    : const CircleAvatar(
        radius: 100,
        child: Icon(
          Icons.person,
        ),
      ),
),
twh00eeo

twh00eeo1#

FirebaseStorage storage = FirebaseStorage.instance;
Reference ref = storage.ref().child(pathname + DateTime.now().toString());
await ref.putFile(File(_image.path));
String imageUrl = await ref.getDownloadURL();
print(imageUrl);
xfb7svmp

xfb7svmp2#

尝试在await imageRef .putFile(selectedImagePath, metadata)中使用发送元数据contentType: "image/jpeg"

try {
                final storageRef = FirebaseStorage.instance.ref();
                final imageRef = storageRef.child("no_image.jpg");
                final ImagePicker picker = ImagePicker();
                // Create file metadata including the content type

                XFile? image =
                    await picker.pickImage(source: ImageSource.gallery);

                if (image != null) {
                  File selectedImagePath = File(image.path);
                  var metadata = SettableMetadata(
                    contentType: "image/jpeg",
                  );
                  await imageRef
                      .putFile(selectedImagePath, metadata)
                      .whenComplete(() {
                    ShowSnack.showToast("File Uploaded...");
                  });
                } else {
                  ShowSnack.showToast("No file selected");
                }
              } on FirebaseException catch (e) {
                // ...
              }

See result
查看要点上的完整示例-https://gist.github.com/akshaysinghhal/66e2ebaf61747040a76c62f826e8e8d1#file-upload_image-dart

au9on6nz

au9on6nz3#

要将文件上载到云存储,首先创建对文件完整路径的引用,包括文件名。创建适当的引用后,然后调用putFile()、putString()或putData()方法将文件上载到云存储。
在此处可以找到带有进度监视和错误处理的上载的完整示例
此外,我建议您查看此线程Firebase Cloud Storage in Flutter
下面是几个类似实现的示例:

另外,请查看这些公共博客,了解更多示例;非Google官方:

相关问题