Flutter:在“MultipartRequest” API中遇到“PayloadTooLargeError: request entity too large”错误?
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
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);
我已经搜索了解决方案,但它们都不起作用,请再次检查一下。
我们还在服务器端增加了负载限制,但是没有起作用。
bodyParser = { json: {limit: '50mb', extended: true}, urlencoded: {limit: '50mb', extended: true} };
我已经尝试了服务器端和我的方式,我也参考了这个链接,但是都没有起作用。请检查我的代码,让我知道我错在哪里?谢谢
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库的信息,请点击此处。
问题出现的原因:由于上传的文件太大,导致出现"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库可以解决这个问题。