diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..090816f --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.19.2" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index bb431f0..a5b4dbb 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,6 @@ build/ !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/lib/chunked_uploader.dart b/lib/chunked_uploader.dart index 5043b77..45ee578 100644 --- a/lib/chunked_uploader.dart +++ b/lib/chunked_uploader.dart @@ -2,6 +2,7 @@ library chunked_uploader; import 'dart:async'; import 'dart:math'; + import 'package:async/async.dart'; import 'package:dio/dio.dart'; import 'package:universal_io/io.dart'; @@ -26,6 +27,8 @@ class ChunkedUploader { ChunkHeadersCallback? headersCallback, String method = 'POST', String fileKey = 'file', + bool stream = false, + Map? queryParameters, }) => _Uploader( _dio, @@ -40,6 +43,8 @@ class ChunkedUploader { maxChunkSize: maxChunkSize, onUploadProgress: onUploadProgress, headersCallback: headersCallback, + stream: stream, + queryParameters: queryParameters, ).upload(); /// Uploads the file using it's path @@ -54,6 +59,8 @@ class ChunkedUploader { ChunkHeadersCallback? headersCallback, String method = 'POST', String fileKey = 'file', + bool stream = false, + Map? queryParameters, }) => _Uploader.fromFilePath( _dio, @@ -67,6 +74,8 @@ class ChunkedUploader { maxChunkSize: maxChunkSize, onUploadProgress: onUploadProgress, headersCallback: headersCallback, + stream: stream, + queryParameters: queryParameters, ).upload(); } @@ -81,6 +90,8 @@ class _Uploader { final Function(double)? onUploadProgress; late int _maxChunkSize; final ChunkHeadersCallback _headersCallback; + final bool stream; + final Map? queryParameters; _Uploader( this.dio, { @@ -95,6 +106,8 @@ class _Uploader { this.onUploadProgress, ChunkHeadersCallback? headersCallback, int? maxChunkSize, + this.stream = false, + this.queryParameters, }) : streamReader = ChunkedStreamReader(fileDataStream), _maxChunkSize = min(fileSize, maxChunkSize ?? fileSize), _headersCallback = headersCallback ?? _defaultHeadersCallback; @@ -111,6 +124,8 @@ class _Uploader { this.onUploadProgress, ChunkHeadersCallback? headersCallback, int? maxChunkSize, + this.stream = false, + this.queryParameters, }) : _headersCallback = headersCallback ?? _defaultHeadersCallback { final file = File(filePath); streamReader = ChunkedStreamReader(file.openRead()); @@ -125,21 +140,37 @@ class _Uploader { final start = _getChunkStart(i); final end = _getChunkEnd(i); final chunkStream = _getChunkStream(); - final formData = FormData.fromMap({ - fileKey: MultipartFile(chunkStream, end - start, filename: fileName), - if (data != null) ...data! - }); - finalResponse = await dio.request( - path, - data: formData, - cancelToken: cancelToken, - options: Options( - method: method, - headers: _headersCallback(start, end, fileSize), - ), - onSendProgress: (current, total) => - _updateProgress(i, current, total), - ); + if (stream) { + finalResponse = await dio.request( + path, + data: chunkStream, + cancelToken: cancelToken, + queryParameters: queryParameters, + options: Options( + method: method, + headers: _headersCallback(start, end, fileSize), + ), + onSendProgress: (current, total) => + _updateProgress(i, current, total), + ); + }else { + final formData = FormData.fromMap({ + fileKey: MultipartFile.fromStream(() => chunkStream, end - start, filename: fileName), + if (data != null) ...data! + }); + finalResponse = await dio.request( + path, + data: formData, + cancelToken: cancelToken, + queryParameters: queryParameters, + options: Options( + method: method, + headers: _headersCallback(start, end, fileSize), + ), + onSendProgress: (current, total) => + _updateProgress(i, current, total), + ); + } } return finalResponse; } catch (_) { diff --git a/pubspec.lock b/pubspec.lock index 47c8f66..fef76e0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,86 +9,78 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" - charcode: - dependency: transitive - description: - name: charcode - sha256: "8e36feea6de5ea69f2199f29cf42a450a855738c498b57c0b980e2d3cca9c362" - url: "https://pub.dev" - source: hosted - version: "1.2.0" collection: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" dio: dependency: "direct main" description: name: dio - sha256: a9d76e72985d7087eb7c5e7903224ae52b337131518d127c554b9405936752b8 + sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8" url: "https://pub.dev" source: hosted - version: "5.2.1+1" + version: "5.4.1" http_parser: dependency: transitive description: name: http_parser - sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.12.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" source_span: dependency: transitive description: name: source_span - sha256: d5f89a9e52b36240a80282b3dc0667dd36e53459717bb17b8fb102d30496606a + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.10.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: dd11571b8a03f7cadcf91ec26a77e02bfbd6bbba2a512924d3116646b4198fc4 + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - sha256: a88162591b02c1f3a3db3af8ce1ea2b374bd75a7bb8d5e353bcfbdc79d719830 + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" typed_data: dependency: transitive description: name: typed_data - sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" universal_io: dependency: "direct main" description: @@ -98,4 +90,4 @@ packages: source: hosted version: "2.2.2" sdks: - dart: ">=2.18.0 <4.0.0" + dart: ">=3.0.0 <4.0.0"