flutter - 使用 MultiPartRequest 上传多张图片:内容大小低于指定的 contentLength
问题描述
我正在尝试将多个图像上传到服务器。我正在使用 http.MultipartRequest。
发现主要错误
未处理的异常:内容大小低于指定的 contentLength。已写入 76 个字节,但预期为 130707。
错误
E/flutter (12577): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Content size below specified contentLength. 76 bytes written but expected 130707.
E/flutter (12577): #0 IOClient.send (package:http/src/io_client.dart:65:7)
E/flutter (12577): <asynchronous suspension>
E/flutter (12577): #1 BaseRequest.send (package:http/src/base_request.dart:116:35)
E/flutter (12577): <asynchronous suspension>
E/flutter (12577): #2 CreateCarDS.uploadImage (package:usedcars_flutter/data_service/create_car_ds.dart:141:34)
E/flutter (12577): #3 _AsyncAwaitCompleter.start (dart:async-patch/async_patch.dart:43:6)
E/flutter (12577): #4 CreateCarDS.uploadImage (package:usedcars_flutter/data_service/create_car_ds.dart:115:44)
E/flutter (12577): #5 AddPageState._editCarNetwork.<anonymous closure>.<anonymous closure> (package:usedcars_flutter/screens/tabs/add_page.dart:1042:36)
E/flutter (12577): #6 State.setState (package:flutter/src/widgets/framework.dart:1141:30)
E/flutter (12577): #7 AddPageState._editCarNetwork.<anonymous closure> (package:usedcars_flutter/screens/tabs/add_page.dart:997:13)
E/flutter (12577): #8 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (12577): #9 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (12577): #10 _FutureListener.handleValue (dart:async/future_impl.dart:137:18)
E/flutter (12577): #11 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:678:45)
E/flutter (12577): #12 Future._propagateToListeners (dart:async/future_impl.dart:707:32)
E/flutter (12577): #13 Future._completeWithValue (dart:async/future_impl.dart:522:5)
E/flutter (12577): #14 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:30:15)
E/flutter (12577): #15 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:288:13)
E/flutter (12577): #16 CreateCarDS.editCar (package:usedcars_flutter/data_service/create_car_ds.dart)
E/flutter (12577): #17 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:71:64)
E/flutter (12577): #18 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (12577): #19 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (12577): #20 _FutureListener.handleValue (dart:async/future_impl.dart:137:18)
E/flutter (12577): #21 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:678:45)
E/flutter (12577): #22 Future._propagateToListeners (dart:async/future_impl.dart:707:32)
E/flutter (12577): #23 Future._completeWithValue (dart:async/future_impl.dart:522:5)
E/flutter (12577): #24 Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:552:7)
E/flutter (12577): #25 _rootRun (dart:async/zone.dart:1124:13)
E/flutter (12577): #26 _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (12577): #27 _CustomZone.runGuarded (dart:async/zone.dart:923:7)
E/flutter (12577): #28 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
E/flutter (12577): #29 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (12577): #30 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter (12577):
上传功能
在这个函数中,我得到的图像是List<File>
. 我遍历图像列表,并将每个 multipartFile 添加到 request.files。我想在这里我错过了一些代码。
Future<http.StreamedResponse> uploadImages({
int id,
List<File> images,
}) async {
String apiUrl = CAR_IMAGE_ADD_URL + id.toString() + '/';
debugPrint(apiUrl);
var uri = Uri.parse(apiUrl);
var request = new http.MultipartRequest('POST', uri);
request.headers.addAll({'Authorization': 'Bearer ' + Profile.instance.accessToken, 'Content-Type': 'multipart/form-data'});
images.forEach((image) async {
var stream = new http.ByteStream(DelegatingStream.typed(image.openRead()));
final length = await image.length();
var multipartFile = new http.MultipartFile('image', stream, length,
filename: basename(image.path));
request.files.add(multipartFile);
});
var response = await request.send();
print(response.statusCode);
response.stream.transform(utf8.decoder).listen((value) {
print(value);
});
uploadStatusCode = httpStatusCodeFinder(response.statusCode);
print(response);
return response;
}
- 我的语法正确吗?
- 我可以使用上述方法上传多张图片吗?
如果您有任何建议或答案,那将非常有帮助。
解决方案
我建议你使用 dio。它是一个更好更强大的http客户端。
您可以轻松上传多部分文件并额外接收上传进度。此外,您可以创建一个包含静态 Dio 的 httpservice,它将被创建一次并由 getter 访问。所以你只需要在初始化时授权一次或者给客户端设置拦截器。
推荐阅读
- java - 在初始化 Winium Driver 时出现 Connection Refused Exception
- java - Gradle Fatjar 构建错误
- json - 运行集合时如何将 Postman 中的 API 请求响应保存到 JSON 文件
- arrays - 使用行(间接(字符串))不起作用
- c# - 连接到 SQL Server 数据库文件时遇到问题。我究竟做错了什么?
- c++ - 无法将 Google Test NuGet 包添加到 Visual Studio Linux C++ 项目
- azure - Azure 模板中的引用模板
- leanft - LeanFT - 远程运行测试会导致随机的 SocketClient 异常
- javascript - 从按钮列表中获取 Arial Label 值
- javascript - 如何重新组织对象数组(附示例)Javascript