【问题标题】:Flutter :- Getting the "PayloadTooLargeError: request entity too large" error in "MultipartRequest" API?Flutter :- 在“MultipartRequest”API 中出现“PayloadTooLargeError: request entity too large”错误?
【发布时间】:2020-04-19 19:20:08
【问题描述】:


我正在使用MultipartRequest 使用请求的参数上传图像,但从下面的代码行中得到以下异常。我使用了 Android Native 的相同 API,它在那里工作得很好,但是在 Flutter Android 平台上出现异常,请检查我从服务器收到的以下错误

请求实体太大

413

PayloadTooLargeError: 请求实体太大
    在 readStream (/data/consagous/loyaltie/node_modules/raw-body/index.js:155:17)
    在 getRawBody (/data/consagous/loyaltie/node_modules/raw-body/index.js:108:12)
    读取时(/data/consagous/loyaltie/node_modules/body-parser/lib/read.js:77:3)
    在 jsonParser (/data/consagous/loyaltie/node_modules/body-parser/lib/types/json.js:135:5)
    在 Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)
    在 trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)
    在/data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7
    在 Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)
    在下一个(/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)
    在记录器(/data/consagous/loyaltie/node_modules/morgan/index.js:144:5)
    在 Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)
    在 trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)
    在 /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7
    在 Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)
    在下一个(/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)
    在 expressInit (/data/consagous/loyaltie/node_modules/express/lib/middleware/init.js:40:5)
    在 Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)
    在 trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)
    在 /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7
    在 Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)
    在下一个(/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)
    在查询(/data/consagous/loyaltie/node_modules/express/lib/middleware/query.js:45:5)
    在 Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)
    在 trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)
    在 /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7
    在 Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)
    在下一个(/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)
    在 Function.handle (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:174:3)

我已经使用下面的代码行使用 Multipart 上传图像,如下所示,请检查一次。

Future<dynamic> apiUploadImage(
      String url,
      String eventType,
      String name,
      String email,
      String password,
      String mobile,
      String _countryId,
      String _stateId,
      String _cityId,
      String _zipCId,
      String address,
      var lati,
      var longi,
      String _categoryId,
      File imageFile) async {
    print("Current state = " + _stateId + " " + _cityId);

    Uri uri = Uri.parse(url);
    MultipartRequest request = new MultipartRequest('POST', uri);
    request.headers[HEADER_CONTENT_TYPE_KEY] = HEADER_CONTENT_TYPE_VALUE;
    request.headers[HEADER_VERSION_KEY] = HEADER_VERSION_VALUE;
    request.headers[HEADER_DEVICE_TYPE_KEY] = HEADER_DEVICE_TYPE_VALUE;
    request.headers[HEADER_DEVICE_ID_KEY] = HEADER_DEVICE_ID_VALUE;
    request.headers[HEADER_AUTH_TOKEN_KEY] = HEADER_AUTH_TOKEN_VALUE;
    request.headers[HEADER_TIME_KEY] = HEADER_TIME_VALUE;

    request.fields['email'] = email;
    request.fields['password'] = password;
    request.fields['name'] = name;
    request.fields['mobile'] = mobile;
    request.fields['country'] = _countryId;
    request.fields['state'] = _stateId;
    request.fields['city'] = _cityId;
    request.fields['zip_code'] = _zipCId;
    request.fields['role_id'] = '3';
    request.fields['device_type'] = HEADER_DEVICE_TYPE_VALUE;
    request.fields['device_token'] = HEADER_AUTH_TOKEN_VALUE;
    request.fields['category_id'] = _categoryId;
    request.fields['address'] = address;
    request.fields['lati'] = lati.toString();
    request.fields['longi'] = longi.toString();

    print("Current state = " + _stateId + " " + _cityId);

    var stream =
        new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
    var length = await imageFile.length();
    var multipartFile = new MultipartFile("imagefile", stream, length,
        filename: imageFile.path);
    request.files.add(multipartFile);

    var response = await request.send();

    final respStr = await response.stream.bytesToString();

    debugPrint(respStr);

  }

即使我在发送之前压缩了图像文件,但问题是一样的,请检查我的压缩器代码以获取如下图像。

imageFile = await ImagePicker.pickImage(source: ImageSource.camera,imageQuality: 85);

我已经搜索了解决方案,但它甚至不起作用请检查一次。

1). First link
2). Second link
3). Third link
4). Forth link

从服务器端,我们也增加了节点服务器的负载限制,如下所示,但它不起作用

bodyParser = { json: {limit: '50mb', extended: true}, urlencoded: {limit: '50mb', extended: true} };

我已经尝试了服务器端和我端的所有方法,我已经引用了这个链接,但所有方法都不适合我。请检查我上面的代码,让我知道我哪里错了?谢谢

【问题讨论】:

  • var length = await imageFile.length();的值是多少?
  • @pskink 我得到了 length= 48614
  • 所以你的图片是~50kB?你的服务器限制是limit: '50mb'?这里出了点问题……
  • @pskink 有什么问题,请指导我。
  • 所以仔细检查你在服务器端真正得到了什么(我的意思是如果它真的是你期望收到的)

标签: android flutter multipartform-data flutter-layout


【解决方案1】:

文件有一个命名的便利构造函数。像这样使用它:

  request.files.add(
    await http.MultipartFile.fromPath(
      'some_form_value_name',
      File('somefile.zip').path,
      contentType: MediaType('application', 'zip'),
    ),
  );

要发送测试数据,请使用其他命名构造函数(fromStringfromBytes),例如:

  request.files.add(http.MultipartFile.fromBytes(
    'another_form_name',
    Uint8List(1000),
    filename: 'somefile.zip',
    contentType: MediaType('application', 'zip'),
  ));

【讨论】:

  • 从上面的代码中得到相同的异常,请检查我尝试过的代码ibb.co/VtX23z8,两种解决方案都试过了。
  • 感谢您的输入,在我使用了运行良好的 DIO 库之后,它对我没有用,再次感谢您的努力并 +1。
【解决方案2】:

我已经使用了所有可能的方法来解决问题但没有人为我工作,然后在我使用了第三方库 dio 3.0.8 并且工作得很好之后上传了服务器上的图像以及请求参数。

pubspec.yaml里面用到了这个库,

dio:^3.0.8

在代码方面,我使用了以下有效的代码。请检查一次。

Dio dio = new Dio(); // with default Options

// Set default configs
    dio.options.baseUrl = BASE_URL;
    dio.options.connectTimeout = 5000; //5s
    dio.options.receiveTimeout = 3000;

    FormData formData = new FormData.fromMap({
      "email": email,
      "password": password,
      "name": name,
      "mobile": mobile,
      "country":_countryId,
      "state": _stateId,
      "city": _cityId,
      "zip_code": _zipCId,
      "role_id": "3",
      "category_id":_categoryId,
      "address": address,
      "lati": lati.toString(),
      "longi": longi.toString(),
      "device_type": HEADER_DEVICE_TYPE_VALUE,


      "profile_image": await MultipartFile.fromFile(imageFile.path,filename: imageFile.path.split("/").last),

    });

    var response = await dio.post(REGISTRATION_URL, data: formData);

    if (response.statusCode == 200) {
      apiResponse.onSuccess(response.toString(), eventType);
      print("Image Uploaded");
    } else {
      apiResponse.onError('Failed to load post');
      print("Upload Failed");
    }
  }

请查看此库以获取更多信息Click here

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多