如何在Dart中发送大型POST数据

时间:2018-05-09 10:15:42

标签: dart flutter

我这样做:

 startUpload(File file) async {
    var bytes = await file.readAsBytes();
    var base64Img = base64.encode(bytes);
    debugPrint(base64Img);

    var apiUrl = "MY_URL";
    var requestBody = new Map<String, String>();
    requestBody["requestType"] = "upload";
    requestBody["job_id"] = jobId.toString();
    requestBody["picture"] = base64Img;
    http.Response response = await http.post(apiUrl, body: requestBody);
  }

我注意到,后端收到的base64Img的长度小于应用程序中生成的长度。当我致电base64Img.length时,我得到 129648 ,但在服务器上,我得到 66401 。请注意,该文件实际上是一个图像。因此,当我从服务器解码一个时,图像的下半部分不会以某种方式显示或失真。

我也在原生Android中发送相同的数据,并且没有任何问题。

所以我的问题是,dart是否对请求正文数据的值有最大长度限制以及如何发送大数据?

1 个答案:

答案 0 :(得分:2)

要通过网络发送大型文件,我必须使用MultipartRequest包中的http,以及MultipartFile及其构造函数MultipartFile.fromBytes

var url = Uri.parse("YOUR_URL");
var request = new http.MultipartRequest("POST", url);
request.fields['some_additional_field'] = 'other_field';
request.files.add(new http.MultipartFile.fromBytes("file", bytes, filename: 
file.name);
request.send().then((response) {
  if (response.statusCode == 200) print("Uploaded!");
});

或者您可以使用FormData仅使用FormData发送文件 - 例如。来自dart的HttpRequest:html

void sendRequest(File file) {
  FormData data = new FormData();
  data.append('field', 'some_string');
  data.appendBlob('file', file);
  HttpRequest.request('YOUR_URL', method: "POST", sendData: data).then((req) 
  {
    print(req.responseText);
  });
}