【发布时间】: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