Skip to content
This repository was archived by the owner on Mar 16, 2019. It is now read-only.

Commit e5d7012

Browse files
committed
Add fs API URI support #114
1 parent 90982bd commit e5d7012

File tree

4 files changed

+238
-103
lines changed

4 files changed

+238
-103
lines changed

src/android/src/main/java/com/RNFetchBlob/RNFetchBlobFS.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.content.CursorLoader;
66
import android.content.res.AssetFileDescriptor;
77
import android.database.Cursor;
8+
import android.graphics.Path;
89
import android.media.MediaScannerConnection;
910
import android.net.Uri;
1011
import android.os.AsyncTask;
@@ -74,7 +75,7 @@ else if(config.fileCache && config.appendExt != null)
7475
* @param path Destination file path.
7576
* @param encoding Encoding of the string.
7677
* @param data Array passed from JS context.
77-
* @param promise
78+
* @param promise RCT Promise
7879
*/
7980
static public void writeFile(String path, String encoding, String data, final boolean append, final Promise promise) {
8081
try {
@@ -86,6 +87,7 @@ static public void writeFile(String path, String encoding, String data, final bo
8687
FileOutputStream fout = new FileOutputStream(f, append);
8788
// write data from a file
8889
if(encoding.equalsIgnoreCase(RNFetchBlobConst.DATA_ENCODE_URI)) {
90+
data = normalizePath(data);
8991
File src = new File(data);
9092
if(!src.exists()) {
9193
promise.reject("RNfetchBlob writeFileError", "source file : " + data + "not exists");
@@ -118,7 +120,7 @@ static public void writeFile(String path, String encoding, String data, final bo
118120
* Write array of bytes into file
119121
* @param path Destination file path.
120122
* @param data Array passed from JS context.
121-
* @param promise
123+
* @param promise RCT Promise
122124
*/
123125
static public void writeFile(String path, ReadableArray data, final boolean append, final Promise promise) {
124126

@@ -432,6 +434,7 @@ static void mkdir(String path, Callback callback) {
432434
* @param callback JS context callback
433435
*/
434436
static void cp(String path, String dest, Callback callback) {
437+
435438
path = normalizePath(path);
436439
InputStream in = null;
437440
OutputStream out = null;
@@ -442,7 +445,6 @@ static void cp(String path, String dest, Callback callback) {
442445
callback.invoke("cp error: source file at path`" + path + "` not exists");
443446
return;
444447
}
445-
446448
if(!new File(dest).exists())
447449
new File(dest).createNewFile();
448450

@@ -456,14 +458,17 @@ static void cp(String path, String dest, Callback callback) {
456458
}
457459

458460
} catch (Exception err) {
459-
if(err != null)
460-
callback.invoke(err.getLocalizedMessage());
461+
callback.invoke(err.getLocalizedMessage());
461462
} finally {
462463
try {
463-
in.close();
464-
out.close();
464+
if (in != null) {
465+
in.close();
466+
}
467+
if (out != null) {
468+
out.close();
469+
}
465470
callback.invoke();
466-
} catch (IOException e) {
471+
} catch (Exception e) {
467472
callback.invoke(e.getLocalizedMessage());
468473
}
469474
}
@@ -491,7 +496,7 @@ static void mv(String path, String dest, Callback callback) {
491496
* @param callback JS context callback
492497
*/
493498
static void exists(String path, Callback callback) {
494-
path = normalizePath(path);
499+
495500
if(isAsset(path)) {
496501
try {
497502
String filename = path.replace(RNFetchBlobConst.FILE_PREFIX_BUNDLE_ASSET, "");
@@ -502,11 +507,11 @@ static void exists(String path, Callback callback) {
502507
}
503508
}
504509
else {
510+
path = normalizePath(path);
505511
boolean exist = new File(path).exists();
506512
boolean isDir = new File(path).isDirectory();
507513
callback.invoke(exist, isDir);
508514
}
509-
510515
}
511516

512517
/**
@@ -535,10 +540,11 @@ static void ls(String path, Callback callback) {
535540
* @param dest Destination of created file
536541
* @param start Start byte offset in source file
537542
* @param end End byte offset
538-
* @param encode
543+
* @param encode NOT IMPLEMENTED
539544
*/
540545
public static void slice(String src, String dest, int start, int end, String encode, Promise promise) {
541546
try {
547+
src = normalizePath(src);
542548
File source = new File(src);
543549
if(!source.exists()) {
544550
promise.reject("RNFetchBlob.slice error", "source file : " + src + " not exists");
@@ -604,6 +610,7 @@ protected Integer doInBackground(String ...args) {
604610
*/
605611
static void stat(String path, Callback callback) {
606612
try {
613+
path = normalizePath(path);
607614
WritableMap result = statFile(path);
608615
if(result == null)
609616
callback.invoke("stat error: failed to list path `" + path + "` for it is not exist or it is not a folder", null);

src/ios/RNFetchBlob/RNFetchBlob.m

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ - (NSDictionary *)constantsToExport
8686
}];
8787
}
8888

89+
#pragma mark - fs.createFile
8990
RCT_EXPORT_METHOD(createFile:(NSString *)path data:(NSString *)data encoding:(NSString *)encoding callback:(RCTResponseSenderBlock)callback) {
9091

9192
NSFileManager * fm = [NSFileManager defaultManager];
@@ -112,7 +113,7 @@ - (NSDictionary *)constantsToExport
112113
callback(@[[NSString stringWithFormat:@"failed to create new file at path %@ please ensure the folder exists"]]);
113114

114115
}
115-
116+
#pragma mark - fs.createFileASCII
116117
// method for create file with ASCII content
117118
RCT_EXPORT_METHOD(createFileASCII:(NSString *)path data:(NSArray *)dataArray callback:(RCTResponseSenderBlock)callback) {
118119

@@ -134,24 +135,22 @@ - (NSDictionary *)constantsToExport
134135

135136
}
136137

137-
138+
#pragma mark - fs.exists
138139
RCT_EXPORT_METHOD(exists:(NSString *)path callback:(RCTResponseSenderBlock)callback) {
139-
BOOL isDir = NO;
140-
BOOL exists = NO;
141-
exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory: &isDir];
142-
callback(@[@(exists), @(isDir)]);
143-
140+
[RNFetchBlobFS exists:path callback:callback];
144141
}
145142

143+
#pragma mark - fs.writeFile
146144
RCT_EXPORT_METHOD(writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
147-
148145
[RNFetchBlobFS writeFile:path encoding:[NSString stringWithString:encoding] data:data append:append resolver:resolve rejecter:reject];
149146
})
150147

148+
#pragma mark - fs.writeArray
151149
RCT_EXPORT_METHOD(writeFileArray:(NSString *)path data:(NSArray *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
152150
[RNFetchBlobFS writeFileArray:path data:data append:append resolver:resolve rejecter:reject];
153151
})
154152

153+
#pragma mark - fs.writeStream
155154
RCT_EXPORT_METHOD(writeStream:(NSString *)path withEncoding:(NSString *)encoding appendData:(BOOL)append callback:(RCTResponseSenderBlock)callback) {
156155
RNFetchBlobFS * fileStream = [[RNFetchBlobFS alloc] initWithBridgeRef:self.bridge];
157156
NSFileManager * fm = [NSFileManager defaultManager];
@@ -165,6 +164,7 @@ - (NSDictionary *)constantsToExport
165164
callback(@[[NSNull null], streamId]);
166165
}
167166

167+
#pragma mark - fs.writeArrayChunk
168168
RCT_EXPORT_METHOD(writeArrayChunk:(NSString *)streamId withArray:(NSArray *)dataArray callback:(RCTResponseSenderBlock) callback) {
169169
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
170170
char * bytes = (char *) malloc([dataArray count]);
@@ -178,12 +178,14 @@ - (NSDictionary *)constantsToExport
178178
callback(@[[NSNull null]]);
179179
}
180180

181+
#pragma mark - fs.writeChunk
181182
RCT_EXPORT_METHOD(writeChunk:(NSString *)streamId withData:(NSString *)data callback:(RCTResponseSenderBlock) callback) {
182183
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
183184
[fs writeEncodeChunk:data];
184185
callback(@[[NSNull null]]);
185186
}
186187

188+
#pragma mark - fs.closeStream
187189
RCT_EXPORT_METHOD(closeStream:(NSString *)streamId callback:(RCTResponseSenderBlock) callback) {
188190
RNFetchBlobFS *fs = [[RNFetchBlobFS getFileStreams] valueForKey:streamId];
189191
[fs closeOutStream];
@@ -200,6 +202,7 @@ - (NSDictionary *)constantsToExport
200202
callback(@[[NSString stringWithFormat:@"failed to unlink file or path at %@", path]]);
201203
}
202204

205+
#pragma mark - fs.removeSession
203206
RCT_EXPORT_METHOD(removeSession:(NSArray *)paths callback:(RCTResponseSenderBlock) callback) {
204207
NSError * error = nil;
205208
NSString * tmpPath = nil;
@@ -215,6 +218,7 @@ - (NSDictionary *)constantsToExport
215218

216219
}
217220

221+
#pragma mark - fs.ls
218222
RCT_EXPORT_METHOD(ls:(NSString *)path callback:(RCTResponseSenderBlock) callback) {
219223
NSFileManager* fm = [NSFileManager defaultManager];
220224
BOOL exist = nil;
@@ -234,28 +238,46 @@ - (NSDictionary *)constantsToExport
234238

235239
}
236240

237-
RCT_EXPORT_METHOD(stat:(NSString *)path callback:(RCTResponseSenderBlock) callback) {
238-
NSFileManager* fm = [NSFileManager defaultManager];
239-
BOOL exist = nil;
240-
BOOL isDir = nil;
241-
NSError * error = nil;
242-
243-
path = [RNFetchBlobFS getPathOfAsset:path];
244-
245-
exist = [fm fileExistsAtPath:path isDirectory:&isDir];
246-
if(exist == NO) {
247-
callback(@[[NSString stringWithFormat:@"failed to list path `%@` for it is not exist or it is not exist", path]]);
248-
return ;
249-
}
250-
NSData * res = [RNFetchBlobFS stat:path error:&error];
251-
252-
if(error == nil)
253-
callback(@[[NSNull null], res]);
254-
else
255-
callback(@[[error localizedDescription], [NSNull null]]);
241+
#pragma mark - fs.stat
242+
RCT_EXPORT_METHOD(stat:(NSString *)target callback:(RCTResponseSenderBlock) callback) {
243+
244+
[RNFetchBlobFS getPathFromUri:target completionHandler:^(NSString *path, ALAssetRepresentation *asset) {
245+
__block NSMutableArray * result;
246+
if(path != nil)
247+
{
248+
NSFileManager* fm = [NSFileManager defaultManager];
249+
BOOL exist = nil;
250+
BOOL isDir = nil;
251+
NSError * error = nil;
252+
253+
exist = [fm fileExistsAtPath:path isDirectory:&isDir];
254+
if(exist == NO) {
255+
callback(@[[NSString stringWithFormat:@"failed to stat path `%@` for it is not exist or it is not exist", path]]);
256+
return ;
257+
}
258+
result = [RNFetchBlobFS stat:path error:&error];
259+
260+
if(error == nil)
261+
callback(@[[NSNull null], result]);
262+
else
263+
callback(@[[error localizedDescription], [NSNull null]]);
256264

265+
}
266+
else if(asset != nil)
267+
{
268+
__block NSNumber * size = [NSNumber numberWithLong:[asset size]];
269+
result = [asset metadata];
270+
[result setValue:size forKey:@"size"];
271+
callback(@[[NSNull null], result]);
272+
}
273+
else
274+
{
275+
callback(@[@"failed to stat path, could not resolve URI", [NSNull null]]);
276+
}
277+
}];
257278
}
258279

280+
#pragma mark - fs.lstat
259281
RCT_EXPORT_METHOD(lstat:(NSString *)path callback:(RCTResponseSenderBlock) callback) {
260282
NSFileManager* fm = [NSFileManager defaultManager];
261283
BOOL exist = nil;
@@ -289,6 +311,7 @@ - (NSDictionary *)constantsToExport
289311

290312
}
291313

314+
#pragma mark - fs.cp
292315
RCT_EXPORT_METHOD(cp:(NSString*)src toPath:(NSString *)dest callback:(RCTResponseSenderBlock) callback) {
293316

294317
// path = [RNFetchBlobFS getPathOfAsset:path];
@@ -312,6 +335,8 @@ - (NSDictionary *)constantsToExport
312335

313336
}
314337

338+
339+
#pragma mark - fs.mv
315340
RCT_EXPORT_METHOD(mv:(NSString *)path toPath:(NSString *)dest callback:(RCTResponseSenderBlock) callback) {
316341
NSError * error = nil;
317342
BOOL result = [[NSFileManager defaultManager] moveItemAtURL:[NSURL fileURLWithPath:path] toURL:[NSURL fileURLWithPath:dest] error:&error];
@@ -323,8 +348,9 @@ - (NSDictionary *)constantsToExport
323348

324349
}
325350

351+
#pragma mark - fs.mkdir
326352
RCT_EXPORT_METHOD(mkdir:(NSString *)path callback:(RCTResponseSenderBlock) callback) {
327-
if([RNFetchBlobFS exists:path]) {
353+
if([[NSFileManager defaultManager] fileExistsAtPath:path]) {
328354
callback(@[@"mkdir failed, folder already exists"]);
329355
return;
330356
}
@@ -333,11 +359,13 @@ - (NSDictionary *)constantsToExport
333359
callback(@[[NSNull null]]);
334360
}
335361

362+
#pragma mark - fs.readFile
336363
RCT_EXPORT_METHOD(readFile:(NSString *)path encoding:(NSString *)encoding resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
337364

338365
[RNFetchBlobFS readFile:path encoding:encoding resolver:resolve rejecter:reject onComplete:nil];
339366
})
340367

368+
#pragma mark - fs.readStream
341369
RCT_EXPORT_METHOD(readStream:(NSString *)path withEncoding:(NSString *)encoding bufferSize:(int)bufferSize) {
342370

343371
RNFetchBlobFS *fileStream = [[RNFetchBlobFS alloc] initWithBridgeRef:self.bridge];
@@ -351,6 +379,7 @@ - (NSDictionary *)constantsToExport
351379
[fileStream readWithPath:path useEncoding:encoding bufferSize:bufferSize];
352380
}
353381

382+
#pragma mark - fs.getEnvionmentDirs
354383
RCT_EXPORT_METHOD(getEnvironmentDirs:(RCTResponseSenderBlock) callback) {
355384

356385
callback(@[
@@ -359,20 +388,24 @@ - (NSDictionary *)constantsToExport
359388
]);
360389
}
361390

391+
#pragma mark - net.cancelRequest
362392
RCT_EXPORT_METHOD(cancelRequest:(NSString *)taskId callback:(RCTResponseSenderBlock)callback) {
363393
[RNFetchBlobNetwork cancelRequest:taskId];
364394
callback(@[[NSNull null], taskId]);
365395

366396
}
367397

398+
#pragma mark - net.enableProgressReport
368399
RCT_EXPORT_METHOD(enableProgressReport:(NSString *)taskId {
369400
[RNFetchBlobNetwork enableProgressReport:taskId];
370401
})
371402

403+
#pragma mark - net.enableUploadProgressReport
372404
RCT_EXPORT_METHOD(enableUploadProgressReport:(NSString *)taskId {
373405
[RNFetchBlobNetwork enableUploadProgress:taskId];
374406
})
375407

408+
#pragma mark - fs.slice
376409
RCT_EXPORT_METHOD(slice:(NSString *)src dest:(NSString *)dest start:(nonnull NSNumber *)start end:(nonnull NSNumber *)end resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject
377410
{
378411
[RNFetchBlobFS slice:src dest:dest start:start end:end encode:@"" resolver:resolve rejecter:reject];

src/ios/RNFetchBlobFS.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
+ (RNFetchBlobFS *) getFileStreams;
5151
+ (BOOL) mkdir:(NSString *) path;
5252
+ (NSDictionary *) stat:(NSString *) path error:(NSError **) error;
53-
+ (BOOL) exists:(NSString *) path;
53+
+ (void) exists:(NSString *) path callback:(RCTResponseSenderBlock)callback;
5454
+ (void) writeFileArray:(NSString *)path data:(NSArray *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
5555
+ (void) writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data append:(BOOL)append resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
5656
+ (void) readFile:(NSString *)path encoding:(NSString *)encoding resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject onComplete:(void (^)(NSData * content))onComplete;

0 commit comments

Comments
 (0)