diff --git a/packages/firebase_storage/CHANGELOG.md b/packages/firebase_storage/CHANGELOG.md index 3b1dfe8e5a85..a9a946249e2b 100644 --- a/packages/firebase_storage/CHANGELOG.md +++ b/packages/firebase_storage/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.0.3 + +* Fix inconsistency of `getPath`, on Android the path returned started with a `/` but on iOS it did not +* Fix content-type auto-detection on Android + ## 3.0.2 * Automatically use version from pubspec.yaml when reporting usage to Firebase. diff --git a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java index 37f8202356f8..406956da7608 100755 --- a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java +++ b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java @@ -6,6 +6,7 @@ import android.net.Uri; import android.util.SparseArray; +import android.webkit.MimeTypeMap; import androidx.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; @@ -49,7 +50,7 @@ private FirebaseStoragePlugin(MethodChannel channel, Registrar registrar) { } @Override - public void onMethodCall(MethodCall call, final Result result) { + public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { String app = call.argument("app"); String storageBucket = call.argument("bucket"); if (app == null && storageBucket == null) { @@ -258,15 +259,13 @@ public void onFailure(@NonNull Exception e) { private void putFile(MethodCall call, Result result) { String filename = call.argument("filename"); String path = call.argument("path"); - Map metadata = call.argument("metadata"); File file = new File(filename); + final Uri fileUri = Uri.fromFile(file); + Map metadata = call.argument("metadata"); + metadata = ensureMimeType(metadata, fileUri); + StorageReference ref = firebaseStorage.getReference().child(path); - UploadTask uploadTask; - if (metadata == null) { - uploadTask = ref.putFile(Uri.fromFile(file)); - } else { - uploadTask = ref.putFile(Uri.fromFile(file), buildMetadataFromMap(metadata)); - } + final UploadTask uploadTask = ref.putFile(fileUri, buildMetadataFromMap(metadata)); final int handle = addUploadListeners(uploadTask); result.success(handle); } @@ -394,7 +393,7 @@ private void cancelUploadTask(MethodCall call, final Result result) { } } - private void resumeUploadTask(MethodCall call, final Result result) { + private void resumeUploadTask(MethodCall call, @NonNull final Result result) { int handle = call.argument("handle"); UploadTask task = uploadTasks.get(handle); if (task != null) { @@ -487,4 +486,25 @@ private Map buildMapFromTaskSnapshot( } return map; } + + private Map ensureMimeType(Map metadata, Uri file) { + if (metadata == null) { + metadata = new HashMap<>(); + } + + if (metadata.get("contentType") == null) { + metadata.put("contentType", getMimeType(file)); + } + + return metadata; + } + + private static String getMimeType(Uri file) { + String type = null; + String extension = MimeTypeMap.getFileExtensionFromUrl(file.toString()); + if (extension != null) { + type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + return type; + } } diff --git a/packages/firebase_storage/example/pubspec.yaml b/packages/firebase_storage/example/pubspec.yaml index c52f55f550b4..321265020fde 100755 --- a/packages/firebase_storage/example/pubspec.yaml +++ b/packages/firebase_storage/example/pubspec.yaml @@ -8,7 +8,7 @@ dependencies: firebase_storage: path: ../ firebase_core: ^0.4.0 - uuid: "^1.0.0" + uuid: ^1.0.0 http: ^0.12.0 dev_dependencies: diff --git a/packages/firebase_storage/lib/src/storage_reference.dart b/packages/firebase_storage/lib/src/storage_reference.dart index ea14de9da8c0..71a31ff98464 100644 --- a/packages/firebase_storage/lib/src/storage_reference.dart +++ b/packages/firebase_storage/lib/src/storage_reference.dart @@ -88,12 +88,18 @@ class StorageReference { /// Returns the full path to this object, not including the Google Cloud /// Storage bucket. Future getPath() async { - return await FirebaseStorage.channel + final String path = await FirebaseStorage.channel .invokeMethod("StorageReference#getPath", { 'app': _firebaseStorage.app?.name, 'bucket': _firebaseStorage.storageBucket, 'path': _pathComponents.join("/"), }); + + if (path.startsWith('/')) { + return path.substring(1); + } else { + return path; + } } /// Returns the short name of this object. diff --git a/packages/firebase_storage/pubspec.yaml b/packages/firebase_storage/pubspec.yaml index c73b88b7f0cf..6569799b60de 100755 --- a/packages/firebase_storage/pubspec.yaml +++ b/packages/firebase_storage/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for Firebase Cloud Storage, a powerful, simple, and cost-effective object storage service for Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_storage -version: 3.0.2 +version: 3.0.3 flutter: plugin: