Skip to content
Open
3 changes: 3 additions & 0 deletions .fvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"flutter": "3.19.2"
}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,6 @@ build/
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages

# FVM Version Cache
.fvm/
61 changes: 46 additions & 15 deletions lib/chunked_uploader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -26,6 +27,8 @@ class ChunkedUploader {
ChunkHeadersCallback? headersCallback,
String method = 'POST',
String fileKey = 'file',
bool stream = false,
Map<String, dynamic>? queryParameters,
}) =>
_Uploader(
_dio,
Expand All @@ -40,6 +43,8 @@ class ChunkedUploader {
maxChunkSize: maxChunkSize,
onUploadProgress: onUploadProgress,
headersCallback: headersCallback,
stream: stream,
queryParameters: queryParameters,
).upload();

/// Uploads the file using it's path
Expand All @@ -54,6 +59,8 @@ class ChunkedUploader {
ChunkHeadersCallback? headersCallback,
String method = 'POST',
String fileKey = 'file',
bool stream = false,
Map<String, dynamic>? queryParameters,
}) =>
_Uploader.fromFilePath(
_dio,
Expand All @@ -67,6 +74,8 @@ class ChunkedUploader {
maxChunkSize: maxChunkSize,
onUploadProgress: onUploadProgress,
headersCallback: headersCallback,
stream: stream,
queryParameters: queryParameters,
).upload();
}

Expand All @@ -81,6 +90,8 @@ class _Uploader {
final Function(double)? onUploadProgress;
late int _maxChunkSize;
final ChunkHeadersCallback _headersCallback;
final bool stream;
final Map<String, dynamic>? queryParameters;

_Uploader(
this.dio, {
Expand All @@ -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;
Expand All @@ -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());
Expand All @@ -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 (_) {
Expand Down
46 changes: 19 additions & 27 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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"