每次使用 Flutter/Firebase 按下上传时,如何创建唯一的图像 ID?

Posted

技术标签:

【中文标题】每次使用 Flutter/Firebase 按下上传时,如何创建唯一的图像 ID?【英文标题】:How to create unique image ID each time upload is pressed using Flutter/Firebase? 【发布时间】:2020-07-18 18:53:27 【问题描述】:

我正在尝试制作一个图片上传按钮并将其链接到 Firebase,这样每次按下按钮时,图片都会发送到 Firebase 存储。这是我的代码的相关sn-ps:

  // Files, and references
  File _imageFile;
  StorageReference _reference =
      FirebaseStorage.instance.ref().child('myimage.jpg');

  Future uploadImage() async 
    // upload the image to firebase storage
    StorageUploadTask uploadTask = _reference.putFile(_imageFile);
    StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;

    // update the uploaded state to true after uploading the image to firebase
    setState(() 
      _uploaded = true;
    );
  
  // if no image file exists, then a blank container shows - else, it will upload 
  //the image upon press
  _imageFile == null
                ? Container()
                : RaisedButton(
                    color: Colors.orange[800],
                    child: Text("Upload to Firebase Storage"),
                    onPressed: () uploadImage();),

但是,每次按下此按钮时,图像都会覆盖具有相同名称的预先存在的图像,我想知道是否有一种方法可以使每次按下按钮时,图像的名称更改,因此原始图像不会被覆盖。我非常感谢我能获得的任何帮助,因为我对 Flutter 和 Firebase 还很陌生。

谢谢!

【问题讨论】:

打印(DateTime.now().toString());可能是可能的解决方案。 是的,这是可能的。谢谢! 【参考方案1】:

我认为您正在寻找 UUID 生成器。

幸运的是,有一个包装:uuid

String fileID = Uuid().v4(); // Generate uuid and store it.

现在您可以使用 postID 作为文件名。

注意当您上传文件时,您可能希望生成新的 uuid 以避免使用旧的 :)

还有一件事:请不要使用 DateTime.now() 想想 如果两个用户同时上传了一张图片

【讨论】:

我会记住这一点;我也一直在看到 UUID。谢谢!【参考方案2】:

基本上,当你打电话时:

FirebaseStorage.instance.ref().child('myimage.jpg');

您每次都在上传同名文件:

我的图片.jpg

为了解决您的问题,您只需为图像生成一个随机密钥。有几种方法可以做到这一点:

理想情况下,您应该使用专门用于此类用例的 Uuid 包。

如果您设置了 Firestore(Firebase 提供的数据库),那么您可以将图像的名称推送到数据库,并让它返回 Firestore 将创建一个随机 ID 的 DocumentID给你不使用的。

您也可以使用当前的日期/时间(这对于主要应用程序来说被认为是一种不好的做法,但对于个人项目它会为您服务):

DateTime.now().toString()

DateTime.now().toIso8601String();

当然,您也可以随时根据您要上传的文件的名称编写自己的哈希函数,您可以这样做:

_imageFile.toString();

然后,一旦你得到文件的随机名称,你应该像这样上传它:

FirebaseStorage.instance.ref().child(myImageName).putFile(_imageFile);

【讨论】:

【参考方案3】:

这可能是一个迟到的答案,但希望它对未来的人有所帮助,我的解决方案也有同样的挑战: 我使用了 DateTime.now().toString(),但在此之前我从 firebase 获得了当前登录的用户 UID,

然后像这样将它添加到每个传出的保存到存储请求中 DateTime.now().toString() + (_auth.currentUser!.uid), 这使得每个文件都是独一无二的,并为我解决了覆盖问题。

方舟*

【讨论】:

【参考方案4】:

只需添加文档参考

DocumentReference myDoc = FirebaseFirestore.instance
    .collection('COLLECTION')
    .doc();

myDoc 拥有您的新文档 ID。

myDoc.set('data':'test');

【讨论】:

以上是关于每次使用 Flutter/Firebase 按下上传时,如何创建唯一的图像 ID?的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是否已登录Flutter&firebase auth |

Flutter Firebase:Firebase 中的数据更新,但未在屏幕上自动显示计数器更新

Flutter Firebase Cloud Messaging onMessage 被触发两次

在 null Flutter Firebase 上调用了 getter 'documents' [重复]

Flutter Firebase Database child('.info/connected') 总是返回 true

想要向新用户显示欢迎页面,并在 Flutter Firebase 中向登录用户显示主屏幕