У меня проблемы с Flutter web и загрузкой изображений в Firestore. Я почти уверен, что проблема заключается в Средстве выбора изображений, так как обычное (мобильное) средство выбора изображений не работает для Интернета. Средство обычного выбора изображений возвращает файл, но альтернативный image_picker_web возвращает изображение, которое отклоняется при загрузке, поскольку оно ожидает Future<File>
.
image_picker_web имеет альтернативу для возврата Uint8List
, который я использовал, а затем преобразуется в File
через dart:html
- и загружает нормально, но изображение повреждено и не отображается
Вот что я сделал:
Нажатие кнопки - выбор изображения как Uint8List
> Преобразование в Image
, Сохранение в памяти и Отображение на экране
onPressed: () async {
//Upload Image as Uint8List
imageBytes = await ImagePickerWeb.getImage(asUint8List: true);
//Convert Uint8List to Image
_image = Image.memory(imageBytes);
//Show new image on screen
setBottomSheetState(() {
image = _image;
});
},
Преобразование Uint8List
в File
с использованием dart:html
File
и имя пользователя UID.png (PNG Uploaded)
imageFile = html.File(imageBytes, '${user.uid}.png');
Использование метода для загрузки файла
import 'dart:async';
import 'package:firebase/firebase.dart' as fb;
import 'package:universal_html/prefer_universal/html.dart' as html;
String url;
Future<String> uploadProfilePhoto(html.File image, {String imageName}) async {
try {
//Upload Profile Photo
fb.StorageReference _storage = fb.storage().ref('profilephotos/$imageName.png');
fb.UploadTaskSnapshot uploadTaskSnapshot = await _storage.put(image).future;
// Wait until the file is uploaded then store the download url
var imageUri = await uploadTaskSnapshot.ref.getDownloadURL();
url = imageUri.toString();
} catch (e) {
print(e);
}
return url;
}
Метод вызова
location = await uploadProfilePhoto(imageFile, imageName: '${user.uid}');
Добавление данных, включая местоположение, в базу данных Firebase
//Pass new user ID through to users Collection to link UserData to this user
await AdminUserData(uid: user.uid).updateAdminUserData(name: userName, email: userEmail, profilephoto: location);
Все работает хорошо, кажется, что изображение повреждено, оно также возвращает почти вдвое больший размер файла, что, очевидно, означает, что файл не возвращается как изображение ..