#firebase #flutter #dart #firebase-storage
#firebase #flutter #dart #firebase-хранилище
Вопрос:
Я пытаюсь загрузить файл из Firebase и сохранить его на своем устройстве. Я следую этому примеру:
Я получаю сообщение об ошибке, что дочернее имя не может быть нулевым или пустым, но файл есть и не является пустым. Когда я печатаю содержимое файла, он показывает, что он пуст. Что я делаю не так?
Это мой код:
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);