J'obtiens une image de Firebase Storage, prends une photo avec l'appareil photo ou en choisis une dans la bibliothèque. Lorsque l'un d'eux est terminé, j'ai une classe qui stocke un Image
afin que je puisse l'utiliser en cas de besoin.
Maintenant, je dois télécharger cette image sur Firebase Storage (modifiée ou nouvelle, peu importe). Firebase me permet d'utiliser l'un des éléments suivants: putData
ou putFile
, chacun ayant besoin d'un Uint8List
ou File
respectivement.
Comment puis-je prendre mon Image
et obtenir un File
ou Uint8List
à partir de celui-ci pour le téléchargement?
-
Pour y remédier, comment puis-je obtenir un File
de mon image lorsque je la récupère à partir de Firebase Storage?
Dans les deux cas, vous obtenez le type de données correct pour télécharger l'image, que ce soit un File
au début ou à la fin.
Lorsque vous sélectionnez une image avec le sélecteur d'images, il renvoie un fichier, vous pouvez utiliser await
pour attendre que l'utilisateur sélectionne un fichier, puis le stocker en tant que fichier. Voici un exemple de code expliquant comment obtenir le fichier à partir du sélecteur d'images et le télécharger sur Firebase.
FirebaseStorage _storage = FirebaseStorage.instance;
Future<Uri> uploadPic() async {
//Get the file from the image picker and store it
File image = await ImagePicker.pickImage(source: ImageSource.gallery);
//Create a reference to the location you want to upload to in firebase
StorageReference reference = _storage.ref().child("images/");
//Upload the file to firebase
StorageUploadTask uploadTask = reference.putFile(file);
// Waits till the file is uploaded then stores the download url
Uri location = (await uploadTask.future).downloadUrl;
//returns the download url
return location;
}
Lorsque vous choisissez votre image dans une galerie ou un appareil photo
utilisez simplement la fonction mentionnée ci-dessous pour obtenir le nom du fichier avec l'extension
basename(image.path)
puis passez le fichier à Firebase Storage Reference avec le chemin vers lequel vous souhaitez télécharger avec le nom du fichier, vous n'avez pas à penser à l'extension du fichier.
Bibliothèques utilisées
import 'package:image_picker/image_picker.Dart';
import 'package:path/path.Dart';
import 'package:firebase_storage/firebase_storage.Dart';
Code:
upload() async {
//pick image use ImageSource.camera for accessing camera.
File image = await ImagePicker.pickImage(source: ImageSource.gallery);
//basename() function will give you the filename
String fileName = basename(image.path);
//passing your path with the filename to Firebase Storage Reference
StorageReference reference =
FirebaseHelper.firebaseStorage().child("your_path/$fileName");
//upload the file to Firebase Storage
StorageUploadTask uploadTask = reference.putFile(image);
//Snapshot of the uploading task
StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;
}
firebase_storage: ^ 3.0.6, image_picker: ^ 0.6.1 ces deux bibliothèques vous devez être utilisé
après cela pour obtenir l'image
Future getImage() async {
var tempImage = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
sampleImage = tempImage;
});
}
et maintenant télécharger l'image
Widget enableUpload() {
return Container(
child: Column(
children: <Widget>[
Image.file(sampleImage, height: 300.0, width: 300.0),
RaisedButton(
elevation: 7.0,
child: Text('Upload'),
textColor: Colors.white,
color: Colors.blue,
onPressed: () {
final StorageReference firebaseStorageRef =
FirebaseStorage.instance.ref().child('myimage.jpg');
final StorageUploadTask task =
firebaseStorageRef.putFile(sampleImage);
},
)
],
),
);
}
vous pouvez utiliser ce widget enableUpload () où vous le souhaitez.
Je ne sais pas quel est votre type Image
. Dans le framework Flutter, il y a est une classe Image
, qui est un widget et ce n'est pas ce que vous obtenez de la caméra.
Dans Flutter, une image n'est généralement qu'un File
, ce qui signifie que putFile
devrait fonctionner correctement.
FirebaseStorage.instance.ref().child(path).putFile(image)
Si ce que j'ai publié ne fonctionne pas, veuillez ajouter des informations sur vos types réels.