I am having issues with Flutter web and uploading Images to Firestore. I'm pretty sure the issue lies in the Image Picker, as the normal(mobile) image picker does not work for the web. The normal image picker returns a File, but the alternative image_picker_web returns an Image, which gets rejected on upload because it's expecting a Future<File>.
image_picker_web has an alternative to return a Uint8List which I have used, and then converted to a File via dart:html - and uploads fine, but the image is corrupted and not viewable.
Here's what I have done:
On Button Press - Pick Image as Uint8List > Convert to Image, Store in memory and Display on Screen
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; }); }, Convert Uint8List to File using dart:html File and name as users UID.png (PNG Uploaded)
imageFile = html.File(imageBytes, '${user.uid}.png'); Use Method to upload File
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; } Call method
location = await uploadProfilePhoto(imageFile, imageName: '${user.uid}'); Add data including Location to Firebase Database
//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); Everything is working OK, just the image seems to be corrupted, it also comes back at almost double the filesize, which obviously means the File isn't coming back as the Image..