Flutter:在“MultipartRequest” API中遇到“PayloadTooLargeError: request entity too large”错误?

6 浏览
0 Comments

Flutter:在“MultipartRequest” API中遇到“PayloadTooLargeError: request entity too large”错误?

我正在使用MultipartRequest来上传图片,并使用请求参数,但是我的代码出现以下异常。我在Android Native中使用了同样的API,并且在那里运行得很好,但是在Flutter Android平台上出现了异常,请检查下面的错误信息,这是我从服务器那里得到的。

请求实体过大

413

PayloadTooLargeError: 请求实体过大

at readStream (/data/consagous/loyaltie/node_modules/raw-body/index.js:155:17)

at getRawBody (/data/consagous/loyaltie/node_modules/raw-body/index.js:108:12)

at read (/data/consagous/loyaltie/node_modules/body-parser/lib/read.js:77:3)

at jsonParser (/data/consagous/loyaltie/node_modules/body-parser/lib/types/json.js:135:5)

at Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)

at trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)

at /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7

at Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)

at next (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)

at logger (/data/consagous/loyaltie/node_modules/morgan/index.js:144:5)

at Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)

at trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)

at /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7

at Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)

at next (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)

at expressInit (/data/consagous/loyaltie/node_modules/express/lib/middleware/init.js:40:5)

at Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)

at trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)

at /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7

at Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)

at next (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)

at query (/data/consagous/loyaltie/node_modules/express/lib/middleware/query.js:45:5)

at Layer.handle [as handle_request] (/data/consagous/loyaltie/node_modules/express/lib/router/layer.js:95:5)

at trim_prefix (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:317:13)

at /data/consagous/loyaltie/node_modules/express/lib/router/index.js:284:7

at Function.process_params (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:335:12)

at next (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:275:10)

at Function.handle (/data/consagous/loyaltie/node_modules/express/lib/router/index.js:174:3)

我使用以下代码使用Multipart上传图片,请检查一下。

Future 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("当前状态 = " + _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("当前状态 = " + _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). 第一个链接

2). 第二个链接

3). 第三个链接

4). 第四个链接

我们还在服务器端增加了负载限制,但是没有起作用。

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

我已经尝试了服务器端和我的方式,我也参考了这个链接,但是都没有起作用。请检查我的代码,让我知道我错在哪里?谢谢

0
0 Comments

Flutter中出现"PayloadTooLargeError: request entity too large"错误是因为使用了MultipartRequest API上传文件时,请求体的大小超过了服务器的限制。解决方法是使用第三方库dio来上传文件,具体代码如下:

在pubspec.yaml文件中添加dio库的依赖:

dio: ^3.0.8

代码部分如下:

Dio dio = new Dio();

// 设置默认配置

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");

}

更多关于dio库的信息,请点击此处

0
0 Comments

问题出现的原因:由于上传的文件太大,导致出现"PayloadTooLargeError: request entity too large"错误。

解决方法:使用Flutter的DIO库来解决该问题。

具体代码如下:

import 'package:dio/dio.dart';

FormData formData = FormData.fromMap({

"some_form_value_name": await MultipartFile.fromFile(

"somefile.zip",

filename: "somefile.zip",

),

});

Dio dio = Dio();

Response response = await dio.post(

"your_api_endpoint",

data: formData,

);

使用DIO库可以解决这个问题。

0