在 firebase 上上传图片的正确顺序
Correct order to upload images on firebase
要为用户创建的对象上传图像,我将图像(由用户选择)作为文件存储在数组 'imagesList' 中。当用户点击上传(整个对象)时,以下方法将数据保存在 firebase 上:
TextButton(
onPressed: () async {
await uploadImage();
await jobService.createJob(Job(
titleTextEditorController.text.trim(),
category,
false,
false,
finalImageList));
},
child: Text('upload')),
第一个方法'uploadImage()'中填充List finalImageList。我用另一种方法获取它来获取 await 语句。代码:
uploadImage() async {
for (int i = 0; i < imageList.length; i++) {
_imageFile = imageList[i];
String fileName = Path.basename(_imageFile!.path);
Reference reference =
FirebaseStorage.instance.ref().child('uploads/$fileName');
firebase_storage.SettableMetadata(
contentType: 'image/jpeg',
customMetadata: {'picked-file-path': fileName});
UploadTask uploadTask = reference.putFile(_imageFile!);
uploadTask.whenComplete(() async {
try {
imageUrl = await reference.getDownloadURL();
print('imageUrl' + imageUrl);
finalImageList.add(imageUrl);
} catch (onError) {
print("Upload Error");
}
});
await Future.value(uploadTask)
.then((value) => {print('Upload file path ${value.ref.fullPath}')})
.onError((error, stackTrace) =>
{print('Upload file path error ${error.toString()}')});
}
}
但是该方法速度不够快,无法将 imageUrl 存储在 finalImageList
中,因此图像在线但未连接到 firebase 中的对象。是否有可能立即上传或正确保存 imageUrl?还是我的代码顺序错误?
FlutterFire UploadTask
class 扩展了 Future
,这意味着您可以在其上使用 await
等待上传完成。
这意味着您可以编写更简单的代码:
await reference.putFile(_imageFile!);
imageUrl = await reference.getDownloadURL();
finalImageList.add(imageUrl);
print('Upload file path ${value.ref.fullPath}')
进行此更改后,您的 uploadImage
将仅在 下载 URL 添加到 finalImageList
后 完成。
要为用户创建的对象上传图像,我将图像(由用户选择)作为文件存储在数组 'imagesList' 中。当用户点击上传(整个对象)时,以下方法将数据保存在 firebase 上:
TextButton(
onPressed: () async {
await uploadImage();
await jobService.createJob(Job(
titleTextEditorController.text.trim(),
category,
false,
false,
finalImageList));
},
child: Text('upload')),
第一个方法'uploadImage()'中填充List finalImageList。我用另一种方法获取它来获取 await 语句。代码:
uploadImage() async {
for (int i = 0; i < imageList.length; i++) {
_imageFile = imageList[i];
String fileName = Path.basename(_imageFile!.path);
Reference reference =
FirebaseStorage.instance.ref().child('uploads/$fileName');
firebase_storage.SettableMetadata(
contentType: 'image/jpeg',
customMetadata: {'picked-file-path': fileName});
UploadTask uploadTask = reference.putFile(_imageFile!);
uploadTask.whenComplete(() async {
try {
imageUrl = await reference.getDownloadURL();
print('imageUrl' + imageUrl);
finalImageList.add(imageUrl);
} catch (onError) {
print("Upload Error");
}
});
await Future.value(uploadTask)
.then((value) => {print('Upload file path ${value.ref.fullPath}')})
.onError((error, stackTrace) =>
{print('Upload file path error ${error.toString()}')});
}
}
但是该方法速度不够快,无法将 imageUrl 存储在 finalImageList
中,因此图像在线但未连接到 firebase 中的对象。是否有可能立即上传或正确保存 imageUrl?还是我的代码顺序错误?
FlutterFire UploadTask
class 扩展了 Future
,这意味着您可以在其上使用 await
等待上传完成。
这意味着您可以编写更简单的代码:
await reference.putFile(_imageFile!);
imageUrl = await reference.getDownloadURL();
finalImageList.add(imageUrl);
print('Upload file path ${value.ref.fullPath}')
进行此更改后,您的 uploadImage
将仅在 下载 URL 添加到 finalImageList
后 完成。