68 lines
2.3 KiB
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);
|
|
}
|
|
}
|