upload method
Implementation
Future<void> upload(Uint8List imgData, String? filePath) async {
// 设置URL
final String apiUrl = '${_baseApiUrl}/v1/assets/upload-v4';
var ext = "";
if (filePath != null) {
ext = (filePath?.split(".").last ?? "#").toLowerCase();
if (!imageTypes.contains(ext) &&
!fileTypes.contains(ext) &&
!videoTypes.contains(ext)) {
_listener?.uploadFailed("不支持的文件格式");
return;
}
}
Dio dio = Dio();
// 设置 Dio 的一些默认配置(如果需要)
dio.options.connectTimeout = const Duration(minutes: 10);
dio.options.receiveTimeout = const Duration(minutes: 15); // 接收超时
dio.options.sendTimeout = const Duration(minutes: 15); // 接收超时
//dio.interceptors.add(CustomInterceptors());
uploadProgress = 1;
_listener?.updateProgress(uploadProgress);
dio.options.headers = {
'Content-Type': 'multipart/form-data',
'Accept': 'multipart/form-data',
'X-Token': xToken,
};
final String fileName = '${DateTime
.now().millisecondsSinceEpoch}.${ext}';
// 创建表单数据
FormData formData = FormData.fromMap({
'type': '4',
'myFile': MultipartFile.fromBytes(
imgData,
filename: fileName,
),
});
debugPrint('xToken=$xToken');
try {
//SmartDialog.showLoading(msg: "上传中");
//Constant.instance.chatLib.idleTimes = 0;
final Response response = await dio.post(apiUrl, data: formData,
onSendProgress: (int sent, int total) {
// debugPrint(
// 'Upload Progress: ${(sent / total * 100).toStringAsFixed(
// 0)}% ${DateTime.now()}');
}, onReceiveProgress: (int rece, int total) {
// debugPrint(
// 'Receive Progress: ${(rece / total * 100).toStringAsFixed(
// 0)}% ${DateTime.now()}');
});
//Constant.instance.chatLib.idleTimes = 0;
if (response.statusCode == 200) {
final responseData = response.data is String
? jsonDecode(response.data)
: response.data;
var result = re.Result<re.FilePath>.fromJson(
responseData,
(json) => re.FilePath.fromJson(json as Map<String, dynamic>),
);
final String filePath = result.data?.filePath ?? "";
debugPrint(filePath);
if (filePath.isNotEmpty) {
var urls = Urls();
urls.uri = filePath;
urls.size = imgData.length;
urls.fileName = fileName;
_listener?.uploadSuccess(urls);
}
print('上传成功: $filePath ${DateTime.now()}');
} else if (response.statusCode == 202) {
if (uploadProgress < 70){
uploadProgress = 70;
}else{
uploadProgress += 10;
}
_listener?.updateProgress(uploadProgress);
final responseData = response.data is String
? jsonDecode(response.data)
: response.data;
var result = re.Result<String>.fromJson(
responseData as Map<String, dynamic>, // Cast to Map<String, dynamic>
(json) => json as String, //
);
print('获得上传地址=${ result.data ?? ""}');
subscribeToSee(apiUrl + "?uploadId=${ result.data ?? ""}");
} else {
print('上传失败:${response.statusMessage}');
_listener?.uploadFailed('上传失败:${response.statusCode} - ${response.statusMessage}');
}
} catch (e) {
_listener?.uploadFailed('上传失败:${e.toString()}');
print('上传失败:$e ${DateTime.now()}');
} finally {
print('上传 finally ${DateTime.now()}');
}
}