From ef3bc339147fbcd514224745b8e240c2517ea333 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Fri, 25 Aug 2017 18:05:50 +0100 Subject: [PATCH] [ios][storage] Correctly set the mime type of the image or video being uploaded --- ios/RNFirebase/storage/RNFirebaseStorage.m | 27 +++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ios/RNFirebase/storage/RNFirebaseStorage.m b/ios/RNFirebase/storage/RNFirebaseStorage.m index e281691f..7c5517c6 100644 --- a/ios/RNFirebase/storage/RNFirebaseStorage.m +++ b/ios/RNFirebase/storage/RNFirebaseStorage.m @@ -3,6 +3,7 @@ #if __has_include() #import "RNFirebaseEvents.h" +#import #import #import @@ -199,6 +200,7 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName metadata:(NSDictionary *) metadata resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { + FIRStorageMetadata *firmetadata = [self buildMetadataFromMap:metadata]; if ([localPath hasPrefix:@"assets-library://"] || [localPath hasPrefix:@"ph://"]) { PHFetchResult *assets; @@ -219,7 +221,8 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName options.networkAccessAllowed = true; [[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { if (info[PHImageErrorKey] == nil) { - [self uploadData:appName data:imageData metadata:metadata path:path resolver:resolve rejecter:reject]; + firmetadata.contentType = [self utiToMimeType:dataUTI]; + [self uploadData:appName data:imageData firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; } else { reject(@"storage/request-image-data-failed", @"Could not obtain image data for the specified file.", nil); } @@ -241,7 +244,8 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (exportSession.status == AVAssetExportSessionStatusCompleted) { - [self uploadFile:appName url:tempUrl metadata:metadata path:path resolver:resolve rejecter:reject]; + firmetadata.contentType = [self utiToMimeType:exportSession.outputFileType]; + [self uploadFile:appName url:tempUrl firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; // we're not cleaning up the temporary file at the moment, just relying on the OS to do that in it's own time - todo? } else { reject(@"storage/temporary-file-failure", @"Unable to create temporary file for upload.", nil); @@ -253,8 +257,9 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName }]; } } else { + // TODO: Content type for file? NSData *data = [[NSFileManager defaultManager] contentsAtPath:localPath]; - [self uploadData:appName data:data metadata:metadata path:path resolver:resolve rejecter:reject]; + [self uploadData:appName data:data firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; } } @@ -264,16 +269,18 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName return [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:filename]; } -- (void)uploadFile:(NSString *)appName url:(NSURL *)url metadata:(NSDictionary *)metadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { +- (NSString *)utiToMimeType:(NSString *) dataUTI { + return (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)dataUTI, kUTTagClassMIMEType); +} + +- (void)uploadFile:(NSString *)appName url:(NSURL *)url firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { FIRStorageReference *fileRef = [self getReference:path appName:appName]; - FIRStorageMetadata *firmetadata = [self buildMetadataFromMap:metadata]; FIRStorageUploadTask *uploadTask = [fileRef putFile:url metadata:firmetadata]; [self addUploadObservers:appName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; } -- (void)uploadData:(NSString *)appName data:(NSData *)data metadata:(NSDictionary *)metadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { +- (void)uploadData:(NSString *)appName data:(NSData *)data firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { FIRStorageReference *fileRef = [self getReference:path appName:appName]; - FIRStorageMetadata *firmetadata = [self buildMetadataFromMap:metadata]; FIRStorageUploadTask *uploadTask = [fileRef putData:data metadata:firmetadata]; [self addUploadObservers:appName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; } @@ -328,14 +335,12 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName - (NSDictionary *)getUploadTaskAsDictionary:(FIRStorageTaskSnapshot *)task { NSString *downloadUrl = [task.metadata.downloadURL absoluteString]; - FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] initWithDictionary:[task.metadata dictionaryRepresentation]]; + NSDictionary *metadata = [task.metadata dictionaryRepresentation]; return @{@"bytesTransferred": @(task.progress.completedUnitCount), @"downloadUrl": downloadUrl != nil ? downloadUrl : [NSNull null], @"metadata": metadata != nil ? metadata : [NSNull null], @"ref": task.reference.fullPath, @"state": [self getTaskStatus:task.status], @"totalBytes": @(task.progress.totalUnitCount)}; } - (FIRStorageMetadata *)buildMetadataFromMap:(NSDictionary *)metadata { - NSMutableDictionary *metaCopy = [metadata mutableCopy]; - [metaCopy removeObjectForKey:@"customMetadata"]; - FIRStorageMetadata *storageMetadata = [[FIRStorageMetadata alloc] initWithDictionary:metaCopy]; + FIRStorageMetadata *storageMetadata = [[FIRStorageMetadata alloc] initWithDictionary:metadata]; storageMetadata.customMetadata = [metadata[@"customMetadata"] mutableCopy]; return storageMetadata; }