如何在dart/flutter中发送图像到API?

roqulrg3  于 2022-12-16  发布在  Flutter
关注(0)|答案(3)|浏览(135)

我看到了其他的问题,但那不是我想要的,我不想上传图像到服务器,我不想转换为base64...
我只想在一个表单数据或其他东西中发布一个文件,并获得返回的信息。
我有这个,但没有工作:

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');
      }
    });
  }
yjghlzjz

yjghlzjz1#

最简单的方法是像this post那样发布一个多部分请求,然后将其发布到服务器。
请确保在文件开头导入以下内容:

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

将此类添加到代码中的某个位置:

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);
      });
    }

然后使用以下方式上传:

upload(File(filePath));

在您的代码中:

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');
      }
    });
  }
v9tzhpje

v9tzhpje2#

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);
    }
aiazj4mn

aiazj4mn3#

如果你正在发送图像到PHP Laravel服务器。尝试减少size of the image,同时发送到服务器。我用Image Picker包来减少图像的大小。

var image = await ImagePicker.pickImage(source: imageSource, imageQuality: 50, maxHeight: 500.0, maxWidth: 500.0);

然后创建一个包含该图像的多部分文件,将其添加到表单数据中,并使用带有dio库的post请求将表单数据发送到服务器。
对我很有效。

相关问题