From a02bb3bff6e4b40f084076fb74eda4bf1280f9c0 Mon Sep 17 00:00:00 2001
From: xuty <xty50337@hotmail.com>
Date: Sun, 29 Mar 2020 20:25:47 +0800
Subject: [PATCH] finish fGetObject & fPutObject

---
 README.md                  |   4 +--
 example/custed.png         | Bin 0 -> 15036 bytes
 example/minio_example.dart |  16 ++++-----
 example/teaweb.png         | Bin 1707 -> 0 bytes
 lib/io.dart                |  71 +++++++++++++++++++++++++++++++++++++
 lib/src/minio.dart         |   2 +-
 lib/src/minio_helpers.dart |  22 ++++++++++++
 pubspec.yaml               |   5 +--
 8 files changed, 107 insertions(+), 13 deletions(-)
 create mode 100644 example/custed.png
 delete mode 100644 example/teaweb.png
 create mode 100644 lib/io.dart

diff --git a/README.md b/README.md
index cb1ff60..bce04ad 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,9 @@ Created from templates made available by Stagehand under a BSD-style
 |-----------------------	|------------------------	|----------------------	|-----------------------------------------	|
 | `makeBucket`           	| `getObject`            	| presignedUrl         	| getBucketNotification                   	|
 | `listBuckets`          	| `getPartialObject`     	| presignedGetObject   	| setBucketNotification                   	|
-| `bucketExists`         	| fGetObject             	| presignedPutObject   	| removeAllBucketNotification             	|
+| `bucketExists`         	| `fGetObject`           	| presignedPutObject   	| removeAllBucketNotification             	|
 | `removeBucket`         	| `putObject`            	| presignedPostPolicy  	| getBucketPolicy                         	|
-| `listObjects`          	| fPutObject             	|                      	| setBucketPolicy                         	|
+| `listObjects`          	| `fPutObject`           	|                      	| setBucketPolicy                         	|
 | `listObjectsV2`        	| `copyObject`           	|                      	| listenBucketNotification                	|
 | `listIncompleteUploads`	| `statObject`           	|                      	|                                         	|
 |                       	| `removeObject`         	|                      	|                                         	|
diff --git a/example/custed.png b/example/custed.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb7f4c21e83607b8a2acb1e94c374c4c5c4b064b
GIT binary patch
literal 15036
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

literal 0
HcmV?d00001

diff --git a/example/minio_example.dart b/example/minio_example.dart
index 882c397..dcf4563 100644
--- a/example/minio_example.dart
+++ b/example/minio_example.dart
@@ -1,5 +1,4 @@
-import 'dart:io';
-
+import 'package:minio/io.dart';
 import 'package:minio/minio.dart';
 
 void main() async {
@@ -12,9 +11,9 @@ void main() async {
   );
 
   final bucket = '00test';
-  final object = 'teaweb.png';
-  final copy1 = '$object.copy1';
-  final copy2 = '$object.copy2';
+  final object = 'custed.png';
+  final copy1 = 'custed.copy1.png';
+  final copy2 = 'custed.copy2.png';
 
   if (!await minio.bucketExists(bucket)) {
     await minio.makeBucket(bucket);
@@ -27,9 +26,7 @@ void main() async {
   print('--- object region:');
   print(region);
 
-  final file = File('example/$object');
-  final size = await file.length();
-  final etag = await minio.putObject(bucket, object, file.openRead(), size);
+  final etag = await minio.fPutObject(bucket, object, 'example/$object');
   print('--- etag:');
   print(etag);
 
@@ -40,6 +37,9 @@ void main() async {
   print('--- copy2 etag:');
   print(copyResult2.eTag);
 
+  await minio.fGetObject(bucket, object, 'example/$copy1');
+  print('--- copy1 downloaded');
+
   await minio.listObjects(bucket).forEach((chunk) {
     print('--- objects:');
     chunk.objects.forEach((o) => print(o.key));
diff --git a/example/teaweb.png b/example/teaweb.png
deleted file mode 100644
index 84746b3b671c92a99bfe0bb17c9abd2a66b24ac6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1707
zcmaJ?Yfuws6b-LdXc=p<R<z0*R769v3C6HnB9A0Uv_ZsB6Rd@hEFnU&F<H!phdeB{
zf@qnxP8fBlVim*@G!CLop%xW^3REbs5uXS}r4*2t7}E^``lEDbcE88mbMCqKJKya7
z(2xzzPK%sKB$6{fm>Win4C_0`miXrGaO)-pSBxjZwxThZPNG3b0Wvfi0r*OZ90@}t
zGX1U^#Fs>}Td5F=Fp=OhSc)pC5^D?<SE>m#iR9~tt0mGn1OuWGxkAMz_y1f;1{5+j
zc^gvz3e+4VRuP=2LAEA_2&IW}Qb<PjTMzi+FhQV1FbRMw<5gN1XOky+VPbCGrjdck
z5G;;Oel1EQ2n9H(1_7AVbzV}Cz7}9XR627V3t~|K2C=4rJ~RgC1wt^>8wMG`)I%n+
zX=E{Q7&mAt7qMcKV=+t((`Y)Kj;iyfq8d4k4nYtNWY8E4FCxNAt5;zX+)Jf(pJw19
zTB$~%#uTUuurf-b(FBZ5CX~J|L8+dhRcWW%L^O<sOVl(v6||N#9Vig|f2dM96RpL<
zkT-h&lUOU%s}WilqD2!lQsUrZ+^wn9Fh_$(FjON%(fH{uhQ^{8s*Od}0EaW#H9#Pd
zDpc0JNsK@M^Ho|*qLLzfE}KlSP!$Rp9LV&hdk3+&;JQFAoz8<GI+w)>gdos|K?fo3
z+G#8ol_n?=6*i5Py}|Nk#aiv4R1=xGh(@s+kp*c`B`{ewte9O(;H-R8SlR4aIJ07D
zgczFjaNj!Y=`F%R*6ECOiN%ch5f$Nh4PkBDf$sUljakg+1_<$vXki_E0~{l{RQ+gQ
zP`@alrO+63jQQm37I_YweYZYZCc7_lZ-E!QD6a{RTy<5PwKua!+G%dmt)H75d;UDQ
z65iO2*A1#cV=1`OhyMrdqA1T5YBz`tu8=6NO>FRKGmMoR9LmMbKV5eI9?#T^AFM{W
zJ|{EV@+&6zYveY2uWs4U$jyulILbMYpM&Rg?@WFgVmeh}#32Jahi4LeMSyD>sqWVT
z%)!lvAA8O{+|xt$GmKvr7e1rt?2cnP*O-`~jUPVDue22PQrx7uLY<;^sJiY@WnnkP
z(WVUd;6Kw?T>q{Z+x=wZ^rpEL$>Rf~qxlv;%gc%3o=8){$s@<X1@e?JK2we))m}J%
z;$uza9?N!p*W>iM{(H&e&RtpmlsXMu7}PRsygff%>{1H+x-`PAaDK!-C*Q;@-`I?8
zZhP`B^wk(g{r+5W*>oUNAROzu4mmCw9%`+8y18OYwfM~KJF9X>ES5W+4P{4Ds_L$W
zJ@i0}-Tjk)>qzSDY|T$CdPG^#9A&uF)86fko^2j)V$1By`8U`4TjJs2eLH_Rl(Fyx
z=??yI_*4@b&m7-mJAYv?W!1qQma(JXJP(NvH;=kqJP9TCRlPJfV2Iu+`7uACsjBtf
zX;o_At&x`O(MFT@uZ|>#dG%*P9iq0UEoc2Q{=8U!JtaEqBgb64yWYbkd_7P=3APb!
z%#El`ofx>JxNatdxs+s<8q3=ZeG+|6-u|wgJ%f82n#%kf4!bY!CEuqkTiS93<nbIs
z-nng4dM&biwEbLm|INm_jLKcD3yLY8bG*)8I;OXaZ_GP0NT28A9o3uK)$uj&-7ig+
z7e~@5X$|7C2wOGFW@zO19h;Xuke7Hx6?g(3wdtQPF`FkWH@+*GC^7l%e&jw-bVMfa
z)W2FHA~6_@iiyFbj*;pQ0)QlQO{>5Cvzj>?W7d$-aj?{68SELZjzlY8y|Uz|uTGn1
z`IcIG#bICjx%c|-ri|b6-{23_*iG23IcWN%FZ>W3*DRj4ewvYF`#y>Hg?({0i}%#}
O`{46JxaR_+GX4d<)xGQh

diff --git a/lib/io.dart b/lib/io.dart
new file mode 100644
index 0000000..26f5ebf
--- /dev/null
+++ b/lib/io.dart
@@ -0,0 +1,71 @@
+import 'dart:io';
+
+import 'package:minio/src/minio.dart';
+import 'package:minio/src/minio_errors.dart';
+import 'package:minio/src/minio_helpers.dart';
+import 'package:path/path.dart' show dirname;
+
+extension MinioX on Minio {
+  Future<String> fPutObject(
+    String bucket,
+    String object,
+    String filePath, [
+    Map<String, String> metaData,
+  ]) async {
+    MinioInvalidBucketNameError.check(bucket);
+    MinioInvalidObjectNameError.check(object);
+
+    metaData ??= {};
+    metaData = insertContentType(metaData, filePath);
+    metaData = prependXAMZMeta(metaData);
+
+    final file = File(filePath);
+    final stat = await file.stat();
+    if (stat.size > maxObjectSize) {
+      throw MinioError(
+        '${filePath} size : ${stat.size}, max allowed size : 5TB',
+      );
+    }
+
+    return putObject(bucket, object, file.openRead(), stat.size);
+  }
+
+  Future<void> fGetObject(
+    String bucket,
+    String object,
+    String filePath,
+  ) async {
+    MinioInvalidBucketNameError.check(bucket);
+    MinioInvalidObjectNameError.check(object);
+
+    final stat = await statObject(bucket, object);
+    final dir = dirname(filePath);
+    await Directory(dir).create(recursive: true);
+
+    final partFileName = '${filePath}.${stat.etag}.part.minio';
+    final partFile = File(partFileName);
+    IOSink partFileStream;
+    var offset = 0;
+
+    final rename = () => partFile.rename(filePath);
+
+    if (await partFile.exists()) {
+      final localStat = await partFile.stat();
+      if (stat.size == localStat.size) return rename();
+      offset = localStat.size;
+      partFileStream = partFile.openWrite(mode: FileMode.append);
+    } else {
+      partFileStream = partFile.openWrite(mode: FileMode.write);
+    }
+
+    final dataStream = await getPartialObject(bucket, object, offset);
+    await dataStream.pipe(partFileStream);
+
+    final localStat = await partFile.stat();
+    if (localStat.size != stat.size) {
+      throw MinioError('Size mismatch between downloaded file and the object');
+    }
+
+    return rename();
+  }
+}
diff --git a/lib/src/minio.dart b/lib/src/minio.dart
index d3551de..787e13d 100644
--- a/lib/src/minio.dart
+++ b/lib/src/minio.dart
@@ -382,7 +382,7 @@ class Minio {
 
     return latestUpload?.uploadId;
   }
-
+  
   Future<String> getBucketRegion(String bucket) async {
     MinioInvalidBucketNameError.check(bucket);
 
diff --git a/lib/src/minio_helpers.dart b/lib/src/minio_helpers.dart
index c0e7277..5c0bf54 100644
--- a/lib/src/minio_helpers.dart
+++ b/lib/src/minio_helpers.dart
@@ -1,3 +1,5 @@
+import 'package:mime/mime.dart' show lookupMimeType;
+
 bool isValidBucketName(String bucket) {
   if (bucket == null) return false;
 
@@ -170,3 +172,23 @@ Map<String, String> extractMetadata(Map<String, String> metaData) {
   }
   return newMetadata;
 }
+
+String probeContentType(String path) {
+  final contentType = lookupMimeType(path);
+  return contentType ?? 'application/octet-stream';
+}
+
+Map<String, String> insertContentType(
+  Map<String, String> metaData,
+  String filePath,
+) {
+  for (var key in metaData.keys) {
+    if (key.toLowerCase() == 'content-type') {
+      return metaData;
+    }
+  }
+
+  final newMetadata = Map<String, String>.from(metaData);
+  newMetadata['content-type'] = probeContentType(filePath);
+  return newMetadata;
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index cccb171..3bd02a1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -5,7 +5,7 @@ version: 0.1.0
 author: xuty <root@xuty.tk>
 
 environment:
-  sdk: ">=2.5.0 <3.0.0"
+  sdk: ">=2.7.0 <3.0.0"
 
 dependencies:
   meta: ^1.1.7
@@ -15,7 +15,8 @@ dependencies:
   xml: ^3.7.0
   buffer: ^1.0.6
   intl: ^0.16.1
-#  path: ^1.6.0
+  mime: ^0.9.6+3
+  path: ^1.6.0
 
 dev_dependencies:
   pedantic: ^1.8.0
-- 
GitLab