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

Zak*_*aru 4 unique-id dart firebase flutter google-cloud-firestore

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

  // 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();}),
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Abd*_*che 8

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

幸运的是,有一个包:uuid

String fileID = Uuid().v4(); // Generate uuid and store it.
Run Code Online (Sandbox Code Playgroud)

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

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

还有一件事:请不要使用 DateTime.now()考虑两个用户是否同时上传了一张图片


ast*_*k12 5

基本上,当你打电话时:

FirebaseStorage.instance.ref().child('myimage.jpg');
Run Code Online (Sandbox Code Playgroud)

您每次都上传同名文件:

我的图像.jpg

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

理想情况下,您将使用专门针对此类用例的Uuid包。

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

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

DateTime.now().toString()
Run Code Online (Sandbox Code Playgroud)

或者

DateTime.now().toIso8601String();
Run Code Online (Sandbox Code Playgroud)

或者当然,您始终可以根据要上传的文件的名称编写自己的哈希函数,您可以通过执行以下操作获得该函数:

_imageFile.toString();
Run Code Online (Sandbox Code Playgroud)

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

FirebaseStorage.instance.ref().child(myImageName).putFile(_imageFile);
Run Code Online (Sandbox Code Playgroud)