Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 证书\u验证\u失败:无法在多部分文件中获取本地颁发者证书_Flutter - Fatal编程技术网

Flutter 证书\u验证\u失败:无法在多部分文件中获取本地颁发者证书

Flutter 证书\u验证\u失败:无法在多部分文件中获取本地颁发者证书,flutter,Flutter,握手异常:客户端握手错误(操作系统错误: 证书验证失败:无法获取本地颁发者证书(handshake.cc:354)) 上载文件和字段时获取握手异常 const TestMode = true; addAssets(Map formFields, List files) async { Map resp = { 'Status' : false, 'Msg' : "Unable to add asset" }; try

握手异常:客户端握手错误(操作系统错误: 证书验证失败:无法获取本地颁发者证书(handshake.cc:354))

上载文件和字段时获取握手异常

const TestMode = true;

addAssets(Map formFields, List files) async {
    Map resp = {
        'Status' : false,
        'Msg' : "Unable to add asset"
    };
    try {
        Uri url = Uri.parse("$BaseUrl$AddAssetUrl");
        http.MultipartRequest multi = http.MultipartRequest("POST", url);
        formFields.forEach((key, val) {
            multi.fields[key] = val;
        });

        for (var val in files) {
            var myFile = await http.MultipartFile.fromPath('MediaFiles[]', val);
            multi.files.add(
                myFile,
            );
        }

        http.StreamedResponse streamedResponse = await multi.send().then((response) async {
            return response;
        });
        String body = await streamedResponse.stream.bytesToString();
        if(streamedResponse.statusCode == 200 && isJSON(body)){
            Map data = json.decode(body);
            resp['Status'] = data['Status'];
            resp['Msg'] = data['Msg'];
        }
        debugPrint(body);

    } catch (e) {
        if(TestMode) print(e.toString());
    }
    return resp;
}
使用MultipartFile上传文件

TestMode是常量

http是包的别名:http/http

参考: 只需通过
IOClient
例如:

    addAssets(Map formFields, List files) async {
        Map resp = {
            'Status' : false,
            'Msg' : "Unable to add asset"
        };
        try {
            Uri url = Uri.parse("$BaseUrl$AddAssetUrl");
            http.MultipartRequest multi = http.MultipartRequest("POST", url);

            formFields.forEach((key, val) {
                multi.fields[key] = val;
            });

            for (var val in files) {
                var myFile = await http.MultipartFile.fromPath('MediaFiles[]', val);
                multi.files.add(
                    myFile,
                );
            }
            HttpClient httpClient = HttpClient();
            httpClient .badCertificateCallback = (X509Certificate cert,String host,int port) {
              return getBaseUrl() == host;
            };
            http.StreamedResponse streamedResponse = await IOClient(
                 httpClient
            ).send(multi);

            String body = await streamedResponse.stream.bytesToString();
            if(streamedResponse.statusCode == 200 && isJSON(body)){
                Map data = json.decode(body);
                resp['Status'] = data['Status'];
                resp['Msg'] = data['Msg'];
            }
            debugPrint(body);

        } catch (e) {
            if(TestMode) print(e.toString());
        }
        return resp;
    }

String getBaseUrl(){
    String url = 'https://hostname.com/api_dir/'; // Your api url
    url = url.substring(url.indexOf('://')+3);
    return url.substring(0,url.indexOf('/'));
}