uploadFile<T> method
上传单个文件
path 请求路径
file 文件对象(File、String 路径或 Uint8List 字节数组)
fieldName 表单字段名(默认 'file')
fileName 文件名(可选,如果不提供则自动提取)
contentType Content-Type(可选,如果不提供则自动推断)
additionalData 额外的表单数据(除了文件之外的其他字段)
queryParameters URL 查询参数
onProgress 上传进度回调 (已上传字节数, 总字节数)
cancelToken 取消令牌
headers 特定请求的请求头(可选),会与全局请求头合并,如果键相同则覆盖全局请求头
示例:
final response = await http.uploadFile<String>(
path: '/api/upload',
file: File('/path/to/image.jpg'),
fieldName: 'avatar',
additionalData: {'userId': '123'},
headers: {'X-Upload-Type': 'avatar'}, // 特定请求头
onProgress: (sent, total) {
print('上传进度: ${(sent / total * 100).toStringAsFixed(1)}%');
},
);
Implementation
Future<Response<T>> uploadFile<T>({
required String path,
dynamic file,
String fieldName = 'file',
String? fileName,
String? contentType,
Map<String, dynamic>? additionalData,
Map<String, dynamic>? queryParameters,
void Function(int sent, int total)? onProgress,
dio_package.CancelToken? cancelToken,
Map<String, String>? headers,
}) async {
// 将 file 参数转换为 UploadFile
UploadFile uploadFile;
if (file is File) {
uploadFile = UploadFile(
file: file,
fieldName: fieldName,
fileName: fileName,
contentType: contentType,
);
} else if (file is String) {
uploadFile = UploadFile(
filePath: file,
fieldName: fieldName,
fileName: fileName,
contentType: contentType,
);
} else if (file is Uint8List) {
uploadFile = UploadFile(
fileBytes: file,
fieldName: fieldName,
fileName: fileName,
contentType: contentType,
);
} else {
throw ArgumentError('file 参数必须是 File、String 或 Uint8List 类型');
}
return uploadFiles<T>(
path: path,
files: [uploadFile],
additionalData: additionalData,
queryParameters: queryParameters,
onProgress: onProgress,
cancelToken: cancelToken,
headers: headers,
);
}