如何通过http post方法将图像上传到REST API中?

时间:2019-08-23 04:50:15

标签: flutter dart

我正在尝试通过post方法通过抖动上传图像。并且我正在使用image_picker从移动设备中选择文件,但是我无法上传

并且我试图发送同样不起作用的文件,例如FormData

      Future<dynamic> uploadLicence(int id ,dynamic obj) async {
          FormData formdata = new FormData(); // just like JS
          formdata.add("image",obj); 
          final response = await post('Logistic/driver/LicenceImage? 
          driverId=$id', 
          formdata);
          print(response);
         //  return null;
     if (response.statusCode == 200) {
         final result = json.decode(response.body);
         return result;
    } else {
          return null;
   }
   }

在那之后,我只是尝试了这种方法,但这也不起作用

   Future<dynamic> uploadLicence(int id, File file) async {
   final url = Uri.parse('$BASE_URL/Logistic/driver/LicenceImage? 
   driverId=$id');
   final fileName = path.basename(file.path);
   final bytes = await compute(compress, file.readAsBytesSync());

   var request = http.MultipartRequest('POST', url)
   ..files.add(new http.MultipartFile.fromBytes(                                                     
  'image',bytes,filename: fileName,);
  var response = await request.send();
  var decoded = await 
  response.stream.bytesToString().then(json.decode);
  if (response.statusCode == HttpStatus.OK) {
  print("image uploded $decoded");
  } else {
   print("image uplod failed ");
  }
  }

             List<int> compress(List<int> bytes) {
             var image = img.decodeImage(bytes);
             var resize = img.copyResize(image);
            return img.encodePng(resize, level: 1);
            }

2 个答案:

答案 0 :(得分:0)

MultipartRequest是可能的。或者,您可以只使用dio包。这是一个命令。

使用http:

import 'package:http/http.dart' as http;

final Uri uri = Uri.parse(url);
final http.MultipartRequest request = http.MultipartRequest("POST", uri);
// Additional key-values here
request.fields['sample'] = variable;
// Adding the file, field is the key for file and file is the value
    request.files.add(http.MultipartFile.fromBytes(
        field, await file.readAsBytes(), filename: filename);
// progress track of uploading process
final http.StreamedResponse response = await request.send();
print('statusCode => ${response.statusCode}');
// checking response data
Map<String, dynamic> data;
await for (String s in response.stream.transform(utf8.decoder)) {
  data = jsonDecode(s);
  print('data: $data');
}

答案 1 :(得分:0)

我在我的项目中使用了此代码,希望对您有用

Upload(File imageFile) async {    
var stream = new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
  var length = await imageFile.length();

  var uri = Uri.parse(uploadURL);

 var request = new http.MultipartRequest("POST", uri);
  var multipartFile = new http.MultipartFile('file', stream, length,
      filename: basename(imageFile.path));
      //contentType: new MediaType('image', 'png'));

  request.files.add(multipartFile);
  var response = await request.send();
  print(response.statusCode);
  response.stream.transform(utf8.decoder).listen((value) {
    print(value);
  });
}