我看到了其他问题,但是那不是我想要的,我不想将图像上传到服务器,我不想转换为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'); } }); }
最简单的方法是张贴multipart请求就像这篇文章,然后将其上传到服务器。
确保将它们导入文件的开头:
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'); } }); }