Flutter:-在“ MultipartRequest” API中出现“ PayloadTooLargeError:请求实体太大”错误?

问题描述 投票:0回答:1

我将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 [作为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 [作为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 [作为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 [作为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 link2). Second link3). Third link4). Forth link

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

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

我已经尝试了服务器端和服务器端的所有方法,并且我已经引用了此链接,但是对于我来说都无效。请检查我上面的代码,让我知道我在哪里错了?谢谢

android flutter multipartform-data flutter-layout
1个回答
0
投票

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

  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'),
  ));
© www.soinside.com 2019 - 2024. All rights reserved.