Flutter web - загрузка файла изображения в хранилище Firebase
В сети Flutter я беру файл изображения с 9X_upload-file компьютера и получаю объект изображения 9X_firebase-cloud-functions File. Затем я хочу загрузить его в Firebase 9X_google-cloud-functions Storage. Для версий приложения для Android 9X_image-uploading и iOS я использовал облачную функцию Firebase 9X_firebase-functions и составной HTTP-запрос. Это сработало, но 9X_google-cloud-functions для веб-версии приложения - нет. Итак,
Как 9X_file-upload я могу загрузить файл изображения html в 9X_flutter-web Firebase Storage напрямую или через облачную 9X_flutter-web функцию?
Ответ #1
Ответ на вопрос: Flutter web - загрузка файла изображения в хранилище Firebase
Наконец-то мне удалось найти решение этой 9X_file-upload проблемы. Для этого мне нужно было установить 9X_firebase-functions две зависимости: firebase и universal_html. Но найти решение было 9X_flutter-web непросто, его реализация была на самом деле 9X_flutter-web простой. Вот код функции, которую я использовал 9X_file-upload для загрузки HTML-файла изображения в Firebase 9X_image-uploading Storage, в папку «images»:
import 'dart:async'; import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:firebase/firebase.dart' as fb; Future uploadImageFile(html.File image, {String imageName}) async { fb.StorageReference storageRef = fb.storage().ref('images/$imageName'); fb.UploadTaskSnapshot uploadTaskSnapshot = await storageRef.put(image).future; Uri imageUri = await uploadTaskSnapshot.ref.getDownloadURL(); return imageUri; }
Надеюсь, это поможет 9X_firebase-storage кому-то с той же потребностью, что и я.
- Исходя из этого ответа, у меня сработало использование [image_picker_for_web] (https://pub.dev/packages/image_picker_for_web) для п ...
Ответ #2
Ответ на вопрос: Flutter web - загрузка файла изображения в хранилище Firebase
После того, как я объединил столько сообщений, я 9X_firebase-storage сделал это, и это работает!
Нет, вам просто 9X_firebase-functions не нужен Тип Universal_HTML или другой image_picker_web. Просто 9X_image-uploading используйте Image Picker (https://pub.dev/packages/image_picker). И используйте 9X_firebase-functions приведенный ниже код, который я использовал 9X_flutter-web для загрузки изображения в хранилище Firebase, и 9X_google-cloud-functions он работает на всех IOS, Android, Web, я 9X_firebase-cloud-functions надеюсь, вы уже добавили разрешение для 9X_firebase-cloud-functions ios и android. Начнем!
Import
import 'package:firebase_storage/firebase_storage.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path/path.dart' as Path;
Call this method when you want to open a file picker in any of the above platforms!
chooseImage() async { PickedFile? pickedFile = await ImagePicker().getImage( source: ImageSource.gallery, ); }
now you've file in pickedFile use kIsWeb to find out if it's web or not!
uploadImageToStorage(PickedFile? pickedFile) async { if(kIsWeb){ Reference _reference = _firebaseStorage .ref() .child('images/${Path.basename(pickedFile!.path)}'); await _reference .putData( await pickedFile!.readAsBytes(), SettableMetadata(contentType: 'image/jpeg'), ) .whenComplete(() async { await _reference.getDownloadURL().then((value) { uploadedPhotoUrl = value; }); }); }else{ //write a code for android or ios } }
Ответ #3
Ответ на вопрос: Flutter web - загрузка файла изображения в хранилище Firebase
Вот полный фрагмент, который мне подходит 9X_file-upload для загрузки изображения: html.File
не работает для 9X_file-upload меня, файл загружен, но вы увидите Error loading preview
в хранилище 9X_image-upload firebase, поэтому просто передача байтов 9X_google-cloud-functions работает для меня.
Чтобы показать изображение, вы 9X_file-upload можете использовать mediaInfo.bytes
с виджетом, который 9X_image-upload поддерживает байты, например, FadeInImage
, вы можете 9X_google-cloud-functions использовать MemoryImage(mediaInfo.bytes)
и Image.memory(mediaInfo.bytes)
используемые пакеты:
- firebase
- image_picker_web
- path
- mime_type
Future imagePicker() async { MediaInfo mediaInfo = await ImagePickerWeb.getImageInfo; return mediaInfo; } Future uploadFile( MediaInfo mediaInfo, String ref, String fileName) async { try { String mimeType = mime(Path.basename(mediaInfo.fileName)); // html.File mediaFile = // new html.File(mediaInfo.data, mediaInfo.fileName, {'type': mimeType}); final String extension = extensionFromMime(mimeType); var metadata = fb.UploadMetadata( contentType: mimeType, ); fb.StorageReference storageReference = fb.storage().ref(ref).child(fileName + ".$extension"); fb.UploadTaskSnapshot uploadTaskSnapshot = await storageReference.put(mediaInfo.data, metadata).future; Uri imageUri = await uploadTaskSnapshot.ref.getDownloadURL(); print("download url $imageUri"); return imageUri; } catch (e) { print("File Upload Error $e"); return null; } }
Ответ #4
Ответ на вопрос: Flutter web - загрузка файла изображения в хранилище Firebase
Ответ на 2023 год
TLDR: конвертируйте файлы в формат XFiles 9X_firebase-functions с помощью пакета cross_file перед загрузкой.
Выберите изображение
Используйте 9X_flutter-web пакет image_picker для выбора изображения. Это работает 9X_firebase-storage на Android, iOS и в Интернете.
Future selectPicture(ImageSource source) async { XFile? image = await imagePicker.pickImage( source: source, maxHeight: 1000, maxWidth: 1000, ); return image?.path; }
Преобразовать XFile в Uint8List
String path = selectPicture(ImageSource.gallery); Uint8List imageData = await XFile(path).readAsBytes()
Загрузить список Uint8List в облачное хранилище
UploadTask uploadTask = storageReference.putData(file);
Ответ #5
Ответ на вопрос: Flutter web - загрузка файла изображения в хранилище Firebase
Чтобы получить доступ к облачному хранилищу 9X_image-upload в вашем приложении Flutter for Web, вы можете 9X_firebase-storage использовать firebase-dart
plugin. Вы можете найти пример accessing storage through firebase-dart
в 9X_image-uploading репо.
- Теперь кажется, что он здесь: http ...
-
21
-
5
-
2
-
2
-
2
-
3
-
4
-
2
-
11
-
2
-
19
-
5
-
3
-
4
-
6
-
3
-
18
-
7
-
4
-
4
-
5
-
11
-
5
-
5
-
5
-
1
-
2
-
2
-
4
-
8
-
6
-
1
-
4
-
1
-
4
-
2
-
1
-
6
-
2
-
6
-
7
-
2
-
5
-
2
-
1
-
4
-
1
-
11
-
4
-
2