POST REQUEST _CastError(类型'_File'不是类型转换中'String'类型的子类型)

时间:2019-09-27 12:45:46

标签: image post flutter dart flutter-layout

我一直在努力使这个东西正常工作。 此POST方法是上传应为“文件”和标题的图像。 该API要求:

PAYLOAD:
- caption
- image
HEADER
- AUTHENTICATION

我是新手,我已经学习了很多教程,但是似乎没有任何效果。

这是我的代码:

 static Future<void> addPost(
      BuildContext context, String caption, File image) async {
    debugPrint("$image");
    String imageFile = image.path.split("/").last;
    debugPrint("$imageFile");
    Utils().showRegisterProgressDialog(context);
    final userData = {
      "caption": caption,
      "image" : image 
    };

    final response = await http.post(
        APIServices.HTTP_DOMAIN + APIServices.POST_ADD_NEW,
        body: userData,
        headers: {"Authentication": "Bearer " + Constants.token});
    debugPrint("STATUS: ${response.statusCode}");

    if (response.statusCode == 200) {
      Utils().hidePostingDialog(context);
      Utils().postSuccessDialog(context);
    } else {
      Utils().hidePostingDialog(context);
      Utils().postErrorDialog(context);
    }

    print(response.body);

    return response;
  }

我将不胜感激。

编辑

我也尝试过使用MultipartRequest,但是它返回的状态码为500

这是我的代码:

static Future<void> addPost(
      BuildContext context, String caption, File image) async {
    Map<String, String> headers = {
      "Authentication": "Bearer ${Constants.token}"
    };
    debugPrint("TOKEN : $headers");
    Utils().showPostingDialog(context);
    var stream = new http.ByteStream(DelegatingStream.typed(image.openRead()));
    var length = await image.length();
    var url =
        Uri.parse("${APIServices.HTTP_DOMAIN}${APIServices.POST_ADD_NEW}");

    debugPrint("TOKEN : $stream");
    debugPrint("TOKEN : $length");
    debugPrint("TOKEN : $url");
    final request = http.MultipartRequest("POST", url);
    debugPrint("TOKEN : $request");
    debugPrint("TOKEN : $image");
    debugPrint("TOKEN : ${image.path}");
    var multipartFile =
        new http.MultipartFile('file', stream, length, filename: image.path);
    debugPrint("TOKEN : ${multipartFile.contentType}");
    request.fields['caption'] = caption;
    request.headers.addAll(headers);
    request.files.add(multipartFile);
    var response = await request.send();
    debugPrint("TOKEN : ${response.request}");
    print(response.statusCode);

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

1 个答案:

答案 0 :(得分:0)

在错误请求期间通常会看到Http错误500。 我建议您使用Postman尝试完全相同的请求并查看结果,您也可以尝试打印出response.message消息,该消息有时可以告诉您格式化请求时出错了。

更多建议:尝试使用DIO包,在其中格式化请求要简单得多,您可以一次设置标头,还可以正确格式化错误,并且提供了许多非常有用的高级功能。