birzha_mobile/lib/services/imageUpload.dart

68 lines
2.3 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:async/async.dart';
import 'package:path/path.dart';
import 'package:birzha/models/exceptions/exception.dart';
import 'package:birzha/models/settings/settingsModel.dart';
import 'package:birzha/models/user/user.dart';
typedef void OnUploadProgressCallback(int sentBytes, int totalBytes);
Future<String?> uploadImage(Uri uri, User user, PlatformFile image, String attributeName, Map<String, String> body,
{required OnUploadProgressCallback onUploadProgressCallback}) async {
var multipartRequest = _MultipartRequest("POST", uri, onProgress: onUploadProgressCallback);
var stream = http.ByteStream(DelegatingStream(File(image.path!).openRead()));
var length = image.size;
var multipartFile = http.MultipartFile(attributeName, stream, length, filename: basename(image.path!));
multipartRequest.files.add(multipartFile);
multipartRequest.fields.addAll({...body});
multipartRequest.headers.addAll({'Authorization': 'Bearer ${user.token}', 'Accept': 'application/json'});
try {
var request = await multipartRequest.send();
var byteArray = await request.stream.toBytes();
var stringBody = utf8.decode(byteArray);
var result = jsonDecode(stringBody);
debugPrint('stringBody $result');
if (result is String) return result;
return result['success']?['backendCode'.translation];
} catch (error) {
if (error is MessageException)
throw error;
else
throw OtherException();
}
}
class _MultipartRequest extends http.MultipartRequest {
_MultipartRequest(
String method,
Uri url, {
required this.onProgress,
}) : super(method, url);
final OnUploadProgressCallback onProgress;
http.ByteStream finalize() {
final byteStream = super.finalize();
final total = this.contentLength;
int bytes = 0;
final t = StreamTransformer.fromHandlers(handleData: (List<int> data, EventSink<List<int>> sink) {
bytes += data.length;
onProgress(bytes, total);
sink.add(data);
}, handleDone: (sink) {
sink.close();
}, handleError: (err, trace, sink) {
sink.close();
});
final stream = byteStream.transform(t);
return http.ByteStream(stream);
}
}