Проблема с загрузкой файла из Firebase во flutter

#firebase #flutter #dart #firebase-storage

#firebase #flutter #dart #firebase-хранилище

Вопрос:

Я пытаюсь загрузить файл из Firebase и сохранить его на своем устройстве. Я следую этому примеру:

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_storage/example/lib/main.dart

Я получаю сообщение об ошибке, что дочернее имя не может быть нулевым или пустым, но файл есть и не является пустым. введите описание изображения здесьКогда я печатаю содержимое файла, он показывает, что он пуст. Что я делаю не так?

Это мой код:

 import 'dart:io';

import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class ImportExcel extends StatefulWidget {
  @override
  _ImportExcelState createState() => _ImportExcelState();
}

class _ImportExcelState extends State<ImportExcel> {
  final String kTestString = 'testFile';

  Future<void> _downloadFile(StorageReference ref) async {
    final String filePath = 'example.txt';
    final String url = await ref.child(filePath).getDownloadURL();
    final http.Response downloadData = await http.get(url);
    final Directory systemTempDir = Directory.systemTemp;
    final File tempFile = File('${systemTempDir.path}/temp$filePath');
    if (tempFile.existsSync()) {
      await tempFile.delete();
    }
    await tempFile.create();
    assert(await tempFile.readAsString() == "");
    final StorageFileDownloadTask task = ref.writeToFile(tempFile);
    print(task);
    final String tempFileContents = await tempFile.readAsString();
    print('Filecontent $tempFileContents');
    print('TestString $kTestString');
    assert(tempFileContents == kTestString);
    final int byteCount = (await task.future).totalByteCount;
    print(byteCount);
    final String fileContents = downloadData.body;
    print(fileContents);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton.extended(
          onPressed: () async {
            StorageReference ref = FirebaseStorage.instance.ref();
            _downloadFile(ref);
          },
          label: Text('Import Data')),
    );
  }
}
  

Это ошибка, которую я получаю:

 I/flutter (16195): Instance of 'StorageFileDownloadTask'
E/MethodChannel#plugins.flutter.io/firebase_storage(16195): Failed to handle method call
E/MethodChannel#plugins.flutter.io/firebase_storage(16195): java.lang.IllegalArgumentException: childName cannot be null or empty
E/MethodChannel#plugins.flutter.io/firebase_storage(16195):     at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown Source:35)
E/MethodChannel#plugins.flutter.io/firebase_storage(16195):     at com.google.firebase.storage.StorageReference.child(com.google.firebase:firebase-storage@@17.0.0:84)
E/MethodChannel#plugins.flutter.io/firebase_storage(16195):     at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.writeToFile(FirebaseStoragePlugin.java:383)
  

Ответ №1:

Это кажется неправильным:

 final StorageFileDownloadTask task = ref.writeToFile(tempFile);
  

Ваша ref переменная равна StorageReference ref = FirebaseStorage.instance.ref() , что означает, что вы пытаетесь загрузить всю корзину.

Более вероятно, что вы хотите:

 var fileRef = ref.child(filePath);
final String url = await fileRef.getDownloadURL();
...
final StorageFileDownloadTask task = fileRef.writeToFile(tempFile);