【问题标题】:File is not uploaded to firebase storage文件未上传到 Firebase 存储
【发布时间】: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


【解决方案1】:

首先你说你在使用return (await storageRef.getDownloadURL());时遇到了一个错误,你能准确的说是哪个错误吗?

然后你可以尝试这样的代码来上传文件并捕获错误:

Future<String> _uploadFile(String filePath) async {
   try {
      final String fileName = DateFormat('yy-MM-ddTH:mm:s').format(DateTime.now()).toString() + filePath.split('/').last;
      final StorageReference storageRef = FirebaseStorage.instance.ref().child(fileName);
      final StorageUploadTask task = storageRef.putFile(File(filePath));
      return await (await task.onComplete).ref.getDownloadURL();
   } catch (error) {
      print(error.toString());
      throw error.toString();
   }
}

我使用过与此类似的代码,直到现在它一直有效。

【讨论】:

  • 抱歉,忘记了错误信息。我尝试了您的确切代码,但仍然遇到相同的错误。我已经更新了我原来的帖子。
  • 您能否也显示您调用_uploadFile(file)的代码部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2019-11-06
  • 2020-04-08
  • 2019-09-06
  • 2021-09-19
  • 2021-07-03
相关资源
最近更新 更多