我正在尝试将图像从Flutter应用程序上传到名为vize.ai(https://vize.ai/docs)的服务。我为此使用dart:http。
我使用dart:http的MultipartFile请求发送文件。我可以从“文件”手柄上载图像,但是,我无法对资产中的图像执行相同的操作。原因是来自资产的图像被加载为ByteData,然后我将其转换为Uint8List(因为MultipartFileRequest需要一个List)。但是,我不断收到来自服务器的错误请求。
适用于文件处理程序的代码。
static Future<http.StreamedResponse> uploadTrainingImages(File imageFile) async {
var stream = new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
var length = await imageFile.length();
String url = 'https://api.vize.ai/v2/training-image/';
var request = new http.MultipartRequest('POST', Uri.parse(url));
request.headers['Authorization'] = "Token " + VIZE_AI_TOKEN;
var multipartFile = new http.MultipartFile('img_path', stream, length, filename: basename(imageFile.path));
request.files.add(multipartFile);
var response = await request.send();
response.stream.listen((value) {
print(value);
});
return response;
}
不适用于图片资产的代码:
static Future<http.StreamedResponse> uploadTrainingImagesFromAssets(String assetName) async {
try {
ByteData data = await rootBundle.load(assetName);
String url = 'https://api.vize.ai/v2/training-image/';
var request = new http.MultipartRequest('POST', Uri.parse(url));
request.headers['Authorization'] = "Token " + VIZE_AI_TOKEN;
var multipartFile = new http.MultipartFile.fromBytes("img_path", data.buffer.asUint8List());
request.files.add(multipartFile);
var response = await request.send();
response.stream.listen((value) {
print(value);
});
return response;
} catch(e) {
print(e);
}
}
想知道我还需要设置什么(例如MediaType)或其他内容吗?