如何在每次使用 Flutter/Firebase 按下上传时创建唯一的图像 ID?
How to create unique image ID each time upload is pressed using Flutter/Firebase?
我正在尝试制作一个图片上传按钮,然后 link 将其发送到 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();}),
但是,每次我按下这个按钮时,图像都会覆盖之前存在的同名图像,我想知道是否有办法让我每次按下按钮时,名称图像发生变化,因此原始图像不会被覆盖。如果我能得到任何帮助,我将不胜感激,因为我对 Flutter 和 Firebase 还很陌生。
谢谢!
基本上,当你打电话时:
FirebaseStorage.instance.ref().child('myimage.jpg');
您每次都在上传同名文件:
myimage.jpg
为了解决您的问题,您只需要为图像生成一个随机密钥。有几种方法可以做到这一点:
理想情况下,您可以使用专门针对此类用例的 Uuid 包。
如果您设置了 Firestore(Firebase 提供的数据库),那么您可以将图像的名称推送到数据库,并将其 return DocumentID 哪个 Firestore 将为您创建一个未使用的随机 ID。
您也可以使用当前的 Date/Time(这对于主要应用程序来说是一种不好的做法,但对于个人项目来说它会很好地为您服务):
DateTime.now().toString()
或
DateTime.now().toIso8601String();
或者当然,您始终可以根据要上传的文件的名称编写自己的哈希函数,您可以通过以下方式获得:
_imageFile.toString();
然后一旦你得到文件的随机名称,你应该像这样上传它:
FirebaseStorage.instance.ref().child(myImageName).putFile(_imageFile);
我认为您正在寻找 UUID 生成器。
幸运的是有一个包:uuid
String fileID = Uuid().v4(); // Generate uuid and store it.
现在您可以使用 postID 作为文件名。
NOTE When you upload your file you may want to generate new uuid to avoid using the old one :)
还有一件事:请不要使用 DateTime.now() 想想 如果两个用户同时上传一张图片[=26= 】 !!
只需添加文档参考
DocumentReference myDoc = FirebaseFirestore.instance
.collection('COLLECTION')
.doc();
myDoc 有您的新文档 ID。
myDoc.set({'data':'test'});
这可能是一个迟到的答案,但希望它对将来的人有帮助,我的解决方案也有同样的挑战:
我使用了 DateTime.now().toString(),但在此之前我从 firebase 获得了当前登录的用户 UID,
然后像这样将其添加到每个传出的保存到存储请求中
DateTime.now().toString() + (_auth.currentUser!.uid),
这使每个文件都独一无二,并为我解决了覆盖问题。
方舟*
我正在尝试制作一个图片上传按钮,然后 link 将其发送到 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();}),
但是,每次我按下这个按钮时,图像都会覆盖之前存在的同名图像,我想知道是否有办法让我每次按下按钮时,名称图像发生变化,因此原始图像不会被覆盖。如果我能得到任何帮助,我将不胜感激,因为我对 Flutter 和 Firebase 还很陌生。
谢谢!
基本上,当你打电话时:
FirebaseStorage.instance.ref().child('myimage.jpg');
您每次都在上传同名文件:
myimage.jpg
为了解决您的问题,您只需要为图像生成一个随机密钥。有几种方法可以做到这一点:
理想情况下,您可以使用专门针对此类用例的 Uuid 包。
如果您设置了 Firestore(Firebase 提供的数据库),那么您可以将图像的名称推送到数据库,并将其 return DocumentID 哪个 Firestore 将为您创建一个未使用的随机 ID。
您也可以使用当前的 Date/Time(这对于主要应用程序来说是一种不好的做法,但对于个人项目来说它会很好地为您服务):
DateTime.now().toString()
或
DateTime.now().toIso8601String();
或者当然,您始终可以根据要上传的文件的名称编写自己的哈希函数,您可以通过以下方式获得:
_imageFile.toString();
然后一旦你得到文件的随机名称,你应该像这样上传它:
FirebaseStorage.instance.ref().child(myImageName).putFile(_imageFile);
我认为您正在寻找 UUID 生成器。
幸运的是有一个包:uuid
String fileID = Uuid().v4(); // Generate uuid and store it.
现在您可以使用 postID 作为文件名。
NOTE When you upload your file you may want to generate new uuid to avoid using the old one :)
还有一件事:请不要使用 DateTime.now() 想想 如果两个用户同时上传一张图片[=26= 】 !!
只需添加文档参考
DocumentReference myDoc = FirebaseFirestore.instance
.collection('COLLECTION')
.doc();
myDoc 有您的新文档 ID。
myDoc.set({'data':'test'});
这可能是一个迟到的答案,但希望它对将来的人有帮助,我的解决方案也有同样的挑战: 我使用了 DateTime.now().toString(),但在此之前我从 firebase 获得了当前登录的用户 UID,
然后像这样将其添加到每个传出的保存到存储请求中 DateTime.now().toString() + (_auth.currentUser!.uid), 这使每个文件都独一无二,并为我解决了覆盖问题。
方舟*