【发布时间】:2020-04-22 23:26:35
【问题描述】:
更新:较小的文件 (
我正在尝试从 Flutter 应用程序将文件上传到 Firebase 存储,但该文件未上传,并且 uploadTask.onComplete 立即完成。在我尝试使用return (await storageRef.getDownloadURL()); 获取 URL 之前,我没有收到任何错误。
以下是相关代码:
_uploadFile(file) async {
String fileName = DateFormat('yy-MM-ddTH:mm:s').format(DateTime.now()).toString() + file.split('/').last;
StorageReference storageRef = FirebaseStorage.instance.ref().child(fileName);
StorageUploadTask uploadTask = storageRef.putFile(File(file));
await uploadTask.onComplete;
return (await storageRef.getDownloadURL());
}
错误:
I/flutter (20165): PlatformException(download_error, Object does not exist at location., null)
E/flutter (20165): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: PlatformException(download_error, Object does not exist at location., null)
E/flutter (20165): #0 _AddNewsState._uploadFile (package:ny_skolapp/add_news.dart:39:7)
E/flutter (20165): <asynchronous suspension>
E/flutter (20165): #1 _AddNewsState._uploadNews (package:ny_skolapp/add_news.dart:49:25)
E/flutter (20165): #2 _AddNewsState.build.<anonymous closure> (package:ny_skolapp/add_news.dart:329:31)
E/flutter (20165): #3 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (20165): #4 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (20165): #5 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (20165): #6 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (20165): #7 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (20165): #8 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (20165): #9 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (20165): #10 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (20165): #11 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (20165): #12 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (20165): #13 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (20165): #14 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (20165): #15 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (20165): #16 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (20165): #17 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (20165): #18 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (20165): #19 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (20165): #20 _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (20165): #21 _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (20165): #22 _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (20165): #23 _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (20165): #24 _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (20165):
调用_uploadFile(file)的代码如下:
_uploadNews() async {
setState(() {
_uploading = true;
});
if (_img != null) {
if (!_img.contains('http')) {
_imgUrl = await _uploadFile(_img);
}else{
_imgUrl = _img;
}
}
if (_file.isNotEmpty) {
for (int i = 0; i < _file.length; i++) {
if (!_file[i].contains('http')) {
_fileUrl.add(await _uploadFile(_file[i]));
}else{
_fileUrl.add(_file[i]);
}
}
}
await Firestore.instance
.collection('news')
.document('$_title ${DateFormat('yyyy-MM-dd kk:mm').format(DateTime.now())}')
.setData({
'title': _title,
'content': _content ?? '',
'time': Timestamp.now(),
'img': _imgUrl ?? '',
'files': _fileUrl ?? [],
'fileNames': _fileName ?? [],
});
setState(() {
_uploading = false;
});
Navigator.of(context).pop();
}
_uploadNews(_img) 和_uploadNews(_file) 有同样的问题。
并且_img和_file在onPressed中设置了两个不同的按钮,代码如下:
_img = await FilePicker.getFilePath(type: FileType.ANY);
和
_file.add(await FilePicker.getFilePath(type: FileType.ANY));
file 来自 FilePicker.getFilePath(type: FileType.ANY),我没有收到任何错误,所以我知道该文件存在。
【问题讨论】:
-
有很多方法可以做到这一点。您可以按照以下示例进行操作:config9.com/apps/firebase/…
-
据我在这里看到,您的代码根本没有检查错误。如果上传失败,您认为这里会发生什么?你怎么知道?
-
但是我在运行时仍然会在终端中看到错误,不是吗?我试过 try / catch 和
.catchError()没有运气。或者在这种情况下还有其他方法可以检查错误吗?此外,更新:较小的文件(
标签: firebase flutter dart firebase-storage