diff --git a/lib/src/minio_client.dart b/lib/src/minio_client.dart
index 40ca29a783bdbe22c8a8b8fd7d1de92927581e8b..af0d2ef6d996cd3eedcfdc6d4711df1dd19b414b 100644
--- a/lib/src/minio_client.dart
+++ b/lib/src/minio_client.dart
@@ -20,29 +20,35 @@ class MinioRequest extends BaseRequest {
   ByteStream finalize() {
     super.finalize();
 
-    late final ByteStream byteStream;
+    if (body == null) {
+      return const ByteStream(Stream.empty());
+    }
+
+    if (body is Stream<Uint8List>) {
+      return ByteStream(body);
+    }
+
+    late Stream<Uint8List> stream;
 
     if (body is String) {
-      final data = utf8.encode(body);
+      final data = Utf8Encoder().convert(body);
       headers['content-length'] = data.length.toString();
-      byteStream = ByteStream.fromBytes(utf8.encode(body));
-    } else if (body is List<int>) {
+      stream = Stream<Uint8List>.value(data);
+    } else if (body is Uint8List) {
+      stream = Stream<Uint8List>.value(body);
       headers['content-length'] = body.length.toString();
-      byteStream = ByteStream.fromBytes(body);
-    } else if (body is Stream<List<int>>) {
-      byteStream = ByteStream(body);
-    } else {
-      throw UnsupportedError('unsupported body type: ${body.runtimeType}');
     }
 
+    stream = stream.transform(BlockStream(1 << 16));
+
     if (onProgress == null) {
-      return byteStream;
+      return ByteStream(stream);
     }
 
     var bytesRead = 0;
 
     return ByteStream(
-      byteStream.transform(
+      stream.transform(
         StreamTransformer.fromHandlers(
           handleData: (data, sink) {
             sink.add(data);
diff --git a/lib/src/minio_uploader.dart b/lib/src/minio_uploader.dart
index ae74afa76498ac74a3a17c8d76d96a6d80696a4d..6926a8c2c643bddcb45fc17df710f49fdaaba795 100644
--- a/lib/src/minio_uploader.dart
+++ b/lib/src/minio_uploader.dart
@@ -118,7 +118,7 @@ class MinioUploader implements StreamConsumer<Uint8List> {
       queries: queries,
       bucket: bucket,
       object: object,
-      payload: Stream.value(chunk).transform(BlockStream(1 << 16)),
+      payload: chunk,
       onProgress: _updateProgress,
     );
 
diff --git a/test/minio_test.dart b/test/minio_test.dart
index 550e42c4862aaf548ba57d35fb0d902c9a73de9e..3d0d0c2eae62c1f28f9bec7112b05c02f40e7647 100644
--- a/test/minio_test.dart
+++ b/test/minio_test.dart
@@ -398,8 +398,33 @@ void testPutObject() {
         Stream.value(objectData),
         onProgress: (bytes) => progress = bytes,
       );
+      await minio.removeObject(bucketName, objectName);
       expect(progress, equals(objectData.length));
+    });
+
+    test('medium size file upload works', () async {
+      final objectName = uniqueName();
+      final dataLength = 1024 * 1024;
+      final data = Uint8List.fromList(List<int>.generate(dataLength, (i) => i));
+      await minio.putObject(bucketName, objectName, Stream.value(data));
+      final stat = await minio.statObject(bucketName, objectName);
+      await minio.removeObject(bucketName, objectName);
+      expect(stat.size, equals(dataLength));
+    });
+
+    test('large file upload works', () async {
+      final objectName = uniqueName();
+      final dataLength = 12 * 1024 * 1024;
+      final data = Uint8List.fromList(List<int>.generate(dataLength, (i) => i));
+      await minio.putObject(
+        bucketName,
+        objectName,
+        Stream.value(data),
+        chunkSize: 5 * 1024 * 1024,
+      );
+      final stat = await minio.statObject(bucketName, objectName);
       await minio.removeObject(bucketName, objectName);
+      expect(stat.size, equals(dataLength));
     });
   });
 }