Merge branch 'master' of github.com:itinance/react-native-fs

* 'master' of github.com:itinance/react-native-fs:
  Added copyAssetsFileIOS to support asset-library-Files from camera-roll in iOS
This commit is contained in:
Hagen Hübel 2017-04-28 01:21:55 +02:00
commit f98be8fd8e
4 changed files with 108 additions and 14 deletions

View File

@ -274,6 +274,15 @@ var RNFS = {
return RNFSManager.copyFileAssets(normalizeFilePath(filepath), normalizeFilePath(destPath)).then(() => void 0);
},
// iOS only
// Copies fotos from asset-library (camera-roll) to a specific location
// with a given width or height
// @see: https://developer.apple.com/reference/photos/phimagemanager/1616964-requestimageforasset
copyAssetsFileIOS(imageUri: string, destPath: string, width: number, height: number,
scale : number = 1.0, compression : number = 1.0, resizeMode : string = 'contain' ): Promise<string> {
return RNFSManager.copyAssetsFileIOS(imageUri, destPath, width, height, scale, compression, resizeMode );
},
writeFile(filepath: string, contents: string, encodingOrOptions?: any): Promise<void> {
var b64;

View File

@ -381,10 +381,20 @@ Note: On Android copyFile will overwrite `destPath` if it already exists. On iOS
### `copyFileAssets(filepath: string, destPath: string): Promise<void>`
Copies the file at `filepath ` in the Android app's assets folder and copies it to the given `destPath ` path.
Copies the file at `filepath` in the Android app's assets folder and copies it to the given `destPath ` path.
Note: Android only. Will overwrite destPath if it already exists
### `copyAssetsFileIOS(imageUri: string, destPath: string, width: number, height: number, scale : number = 1.0, compression : number = 1.0, resizeMode : string = 'contain' ): Promise<string>`
iOS-ony: copies a file from camera-roll, that is prefixed with "assets-library://asset/asset.JPG?..."
to a specific destination. It will download the original from iCloud if necessary.
If width and height is > 0, the image will be resized to a specific size and a specific compression rate.
If scale is below 1, the image will be scaled according to the scale-factor (between 0.0 and 1.0)
The resizeMode is also considered.
Further information: https://developer.apple.com/reference/photos/phimagemanager/1616964-requestimageforasset
The promise will on success return the final destination of the file, as it was defined in the destPath-parameter.
### `unlink(filepath: string): Promise<void>`
Unlinks the item at `filepath`. If the item does not exist, an error will be thrown.

View File

@ -6,17 +6,8 @@
// Copyright (c) 2015 Johannes Lumpe. All rights reserved.
//
#if __has_include("RCTBridgeModule.h")
#import "RCTBridgeModule.h"
#else
#import <React/RCTBridgeModule.h>
#endif
#if __has_include("RCTLog.h")
#import "RCTLog.h"
#else
#import <React/RCTLog.h>
#endif
@interface RNFSManager : NSObject <RCTBridgeModule>

View File

@ -12,13 +12,13 @@
#import "Downloader.h"
#import "Uploader.h"
#if __has_include("RCTEventDispatcher.h")
#import "RCTEventDispatcher.h"
#else
#import <React/RCTEventDispatcher.h>
#endif
#import <React/RCTUtils.h>
#import <React/RCTImageLoader.h>
#import <CommonCrypto/CommonDigest.h>
#import <Photos/Photos.h>
@interface RNFSManager()
@ -503,6 +503,90 @@ RCT_EXPORT_METHOD(getFSInfo:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromise
}
}
/**
* iOS Only: copy images from the assets-library (camera-roll) to a specific path, asuming
* JPEG-Images. Video-Support will follow up, not implemented yet.
*
* It is also supported to scale the image via scale-factor (0.0-1.0) or with a specific
* width and height. Also the resizeMode will be considered.
*/
RCT_EXPORT_METHOD(copyAssetsFileIOS: (NSString *) imageUri
toFilepath: (NSString *) destination
width: (NSInteger) width
height: (NSInteger) height
scale: (CGFloat) scale
compression: (CGFloat) compression
resizeMode: (RCTResizeMode) resizeMode
resolver: (RCTPromiseResolveBlock) resolve
rejecter: (RCTPromiseRejectBlock) reject)
{
CGSize size = CGSizeMake(width, height);
NSURL* url = [NSURL URLWithString:imageUri];
PHFetchResult *results = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil];
if (results.count == 0) {
NSString *errorText = [NSString stringWithFormat:@"Failed to fetch PHAsset with local identifier %@ with no error message.", imageUri];
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:errorText forKey:NSLocalizedDescriptionKey];
NSError *error = [NSError errorWithDomain:@"RNFS" code:500 userInfo:details];
[self reject: reject withError:error];
return;
}
PHAsset *asset = [results firstObject];
PHImageRequestOptions *imageOptions = [PHImageRequestOptions new];
// Allow us to fetch images from iCloud
imageOptions.networkAccessAllowed = YES;
// Note: PhotoKit defaults to a deliveryMode of PHImageRequestOptionsDeliveryModeOpportunistic
// which means it may call back multiple times - we probably don't want that
imageOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
BOOL useMaximumSize = CGSizeEqualToSize(size, CGSizeZero);
CGSize targetSize;
if (useMaximumSize) {
targetSize = PHImageManagerMaximumSize;
imageOptions.resizeMode = PHImageRequestOptionsResizeModeNone;
} else {
targetSize = CGSizeApplyAffineTransform(size, CGAffineTransformMakeScale(scale, scale));
imageOptions.resizeMode = PHImageRequestOptionsResizeModeFast;
}
PHImageContentMode contentMode = PHImageContentModeAspectFill;
if (resizeMode == RCTResizeModeContain) {
contentMode = PHImageContentModeAspectFit;
}
// PHImageRequestID requestID =
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:targetSize
contentMode:contentMode
options:imageOptions
resultHandler:^(UIImage *result, NSDictionary<NSString *, id> *info) {
if (result) {
NSData *imageData = UIImageJPEGRepresentation(result, compression );
[imageData writeToFile:destination atomically:YES];
resolve(destination);
} else {
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:info[PHImageErrorKey] forKey:NSLocalizedDescriptionKey];
NSError *error = [NSError errorWithDomain:@"RNFS" code:501 userInfo:details];
[self reject: reject withError:error];
}
}];
}
- (NSNumber *)dateToTimeIntervalNumber:(NSDate *)date
{
return @([date timeIntervalSince1970]);