web-dev-qa-db-fra.com

Comment envoyer une image vers une API en Dart / Flutter?

J'ai vu d'autres questions, mais ce n'est pas ce que je veux, je ne veux pas télécharger une image sur un serveur, je ne veux pas convertir en base64 ...

Je veux seulement publier un fichier sous forme de données de formulaire ou autre et obtenir les informations retournées.

j'ai cela, mais n'a pas fonctionné:

  void onTakePictureButtonPressed() {
    takePicture().then((String filePath) {
      if (mounted) {
        setState(() {
          imagePath = filePath;
          videoController?.dispose();
          videoController = null;
        });

        http.post('http://ip:8082/composer/predict', headers: {
          "Content-type": "multipart/form-data",
        }, body: {
          "image": filePath,
        }).then((response) {
          print("Response status: ${response.statusCode}");
          print("Response body: ${response.body}");
        });


        if (filePath != null) showInSnackBar('Picture saved to $filePath');
      }
    });
  }
4
Meta Code

La méthode la plus simple serait de poster une requête en plusieurs parties comme dans ce message puis de la poster sur le serveur.

Assurez-vous de les importer au début du fichier:

import 'package:path/path.Dart';
import 'package:async/async.Dart';
import 'Dart:io';
import 'package:http/http.Dart' as http;
import 'Dart:convert';

Ajoutez cette classe quelque part dans votre code:

upload(File imageFile) async {    
      // open a bytestream
      var stream = new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
      // get file length
      var length = await imageFile.length();

      // string to uri
      var uri = Uri.parse("http://ip:8082/composer/predict");

      // create multipart request
      var request = new http.MultipartRequest("POST", uri);

      // multipart that takes file
      var multipartFile = new http.MultipartFile('file', stream, length,
          filename: basename(imageFile.path));

      // add file to multipart
      request.files.add(multipartFile);

      // send
      var response = await request.send();
      print(response.statusCode);

      // listen for response
      response.stream.transform(utf8.decoder).listen((value) {
        print(value);
      });
    }

Téléchargez ensuite en utilisant:

upload(File(filePath));

Dans votre code:

void onTakePictureButtonPressed() {
    takePicture().then((String filePath) {
      if (mounted) {
        setState(() {
          imagePath = filePath;
          videoController?.dispose();
          videoController = null;
        });

       // initiate file upload
       Upload(File(filePath));

        if (filePath != null) showInSnackBar('Picture saved to $filePath');
      }
    });
  }
16
Bostrot
 import 'package:dio/dio.Dart'; //From 3.x.x version

    uploadImage(){
        var formData = FormData();
        formData.files.add(MapEntry("Picture", await MultipartFile.fromFile(data.foto.path, filename: "pic-name.png"), ));
        var response = await dio.client.post('v1/post', data: formdata);
    }
1
Elialber Lopes