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

Commit d249efc

Browse files
committed
Add Blob.slice implementation #89
This commit includes Android and IOS implementations.
1 parent cfee391 commit d249efc

File tree

7 files changed

+70
-23
lines changed

7 files changed

+70
-23
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ public void cancelRequest(String taskId, Callback callback) {
223223
}
224224

225225
@ReactMethod
226-
public void slice(String src, String dest, int start, int end, String encode, Callback callback) {
227-
RNFetchBlobFS.slice(src, dest, start, end, encode, callback);
226+
public void slice(String src, String dest, int start, int end, Promise promise) {
227+
RNFetchBlobFS.slice(src, dest, start, end, "", promise);
228228
}
229229

230230
@ReactMethod

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ static void ls(String path, Callback callback) {
537537
* @param encode
538538
* @param callback
539539
*/
540-
public static void slice(String src, String dest, int start, int end, String encode, Callback callback) {
540+
public static void slice(String src, String dest, int start, int end, String encode, Promise promise) {
541541
try {
542542
long expected = end - start;
543543
long now = 0;
@@ -547,17 +547,25 @@ public static void slice(String src, String dest, int start, int end, String enc
547547
byte [] buffer = new byte[10240];
548548
while(now < expected) {
549549
long read = in.read(buffer, 0, 10240);
550+
long remain = expected - now;
550551
if(read <= 0) {
551552
break;
552553
}
554+
if(remain < 10240) {
555+
out.write(buffer, 0, (int) remain);
556+
}
557+
else
558+
out.write(buffer, 0, (int) read);
553559
now += read;
554-
out.write(buffer, 0, (int) read);
560+
555561
}
556562
in.close();
563+
out.flush();
557564
out.close();
558-
callback.invoke(null, dest);
565+
promise.resolve(dest);
559566
} catch (Exception e) {
560567
e.printStackTrace();
568+
promise.reject(e.getLocalizedMessage());
561569
}
562570
}
563571

src/fs.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ function exists(path:string):Promise<bool, bool> {
299299

300300
}
301301

302+
function slice(src:string, dest:string, start:number, end:number):Promise {
303+
return RNFetchBlob.slice(src, dest, start, end)
304+
}
305+
302306
function isDir(path:string):Promise<bool, bool> {
303307

304308
return new Promise((resolve, reject) => {
@@ -333,5 +337,6 @@ export default {
333337
lstat,
334338
scanFile,
335339
dirs,
340+
slice,
336341
asset
337342
}

src/ios/RNFetchBlob/RNFetchBlob.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,9 +362,11 @@ - (NSDictionary *)constantsToExport
362362
[RNFetchBlobNetwork enableUploadProgress:taskId];
363363
})
364364

365-
RCT_EXPORT_METHOD(slice:(NSString *)src dest:(NSString *)dest start:(NSNumber *)start end:(NSNumber *)end resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject
365+
RCT_EXPORT_METHOD(slice:(NSString *)src dest:(NSString *)dest start:(nonnull NSNumber *)start end:(nonnull NSNumber *)end resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject
366366
{
367-
[RNFetchBlobFS slice:src dest:dest start:start end:end encode:@"" resolver:resolve rejecter:reject];
367+
dispatch_sync(dispatch_get_main_queue(),^(void){
368+
[RNFetchBlobFS slice:src dest:dest start:start end:end encode:@"" resolver:resolve rejecter:reject];
369+
});
368370
})
369371

370372
#pragma mark RNFetchBlob private methods

src/ios/RNFetchBlobFS.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,13 @@
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;
5757
+ (void) readAssetFile:(NSData *)assetUrl completionBlock:(void(^)(NSData * content))completionBlock failBlock:(void(^)(NSError * err))failBlock;
58-
+ (void) slice:(NSString *)path dest:(NSString *)dest start:(NSNumber *)start end:(NSNumber *)end encode:(NSString *)encode resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
58+
+ (void)slice:(NSString *)path
59+
dest:(NSString *)dest
60+
start:(nonnull NSNumber *)start
61+
end:(nonnull NSNumber *)end
62+
encode:(NSString *)encode
63+
resolver:(RCTPromiseResolveBlock)resolve
64+
rejecter:(RCTPromiseRejectBlock)reject;
5965
//+ (void) writeFileFromFile:(NSString *)src toFile:(NSString *)dest append:(BOOL)append;
6066

6167
// constructor

src/ios/RNFetchBlobFS.m

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,11 @@ - (void)readWithPath:(NSString *)path useEncoding:(NSString *)encoding bufferSiz
525525
}
526526

527527
// Slice a file into another file, generally for support Blob implementation.
528-
- (void)slice:(NSString *)path
528+
+ (void)slice:(NSString *)path
529529
dest:(NSString *)dest
530-
start:(NSNumber *)start
531-
end:(NSNumber *)end
532-
encod:(NSString *)encode
530+
start:(nonnull NSNumber *)start
531+
end:(nonnull NSNumber *)end
532+
encode:(NSString *)encode
533533
resolver:(RCTPromiseResolveBlock)resolve
534534
rejecter:(RCTPromiseRejectBlock)reject
535535
{
@@ -547,20 +547,29 @@ - (void)slice:(NSString *)path
547547
}
548548
long size = [fm attributesOfItemAtPath:path error:nil].fileSize;
549549
// abort for the file size is less than start
550-
if(size < start)
550+
if(size < [start longValue])
551551
{
552-
reject(@"RNFetchBlob slice failed", @"start is greater than file size", @"");
552+
reject(@"RNFetchBlob slice failed", @"start is greater than file size", @"start is greater than file size");
553553
return;
554554
}
555555
if(![fm fileExistsAtPath:dest]) {
556556
[fm createFileAtPath:dest contents:@"" attributes:nil];
557557
}
558-
[handle seekToFileOffset:start];
558+
[handle seekToFileOffset:[start longValue]];
559559
while(read < expected)
560560
{
561+
561562
NSData * chunk = [handle readDataOfLength:10240];
563+
long remain = expected - read;
564+
if(remain < 10240)
565+
{
566+
[os write:[chunk bytes] maxLength:remain];
567+
}
568+
else
569+
{
570+
[os write:[chunk bytes] maxLength:10240];
571+
}
562572
read += [chunk length];
563-
[os write:[chunk bytes] maxLength:10240];
564573
}
565574
[handle closeFile];
566575
[os close];

src/polyfill/Blob.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import EventTarget from './EventTarget'
1111
const log = new Log('Blob')
1212
const blobCacheDir = fs.dirs.DocumentDir + '/RNFetchBlob-blobs/'
1313

14-
log.disable()
15-
// log.level(3)
14+
// log.disable()
15+
log.level(3)
1616

1717
/**
1818
* A RNFetchBlob style Blob polyfill class, this is a Blob which compatible to
@@ -181,6 +181,14 @@ export default class Blob extends EventTarget {
181181
return this
182182
}
183183

184+
markAsDerived() {
185+
this._isDerived = true
186+
}
187+
188+
get isDerived() {
189+
return this._isDerived || false
190+
}
191+
184192
/**
185193
* Get file reference of the Blob object.
186194
* @nonstandard
@@ -197,13 +205,22 @@ export default class Blob extends EventTarget {
197205
* @param {string} contentType Optional, content type of new Blob object
198206
* @return {Blob}
199207
*/
200-
slice(start:?number, end:?number, encoding:?string):Blob {
208+
slice(start:?number, end:?number, contentType:?string):Blob {
201209
if(this._closed)
202210
throw 'Blob has been released.'
203-
log.verbose('slice called', start, end, encoding)
204-
console.warn('RNFB#Blob.slice() is not implemented yet, to read Blob content, use Blob.readBlob(encoding:string) instead.')
205-
// TODO : fs.slice
206-
// return fs.slice(this.cacheName, getBlobName(), contentType, start, end)
211+
log.verbose('slice called', start, end, contentType)
212+
let resPath = blobCacheDir + getBlobName()
213+
let pass = false
214+
log.debug('fs.slice new blob will at', resPath)
215+
fs.slice(this._ref, resPath, start, end).then((dest) => {
216+
log.debug('fs.slice done', dest)
217+
pass = true
218+
})
219+
.catch((err) => {
220+
pass = true
221+
})
222+
log.debug('slice returning new Blob')
223+
return new Blob(RNFetchBlob.wrap(resPath))
207224
}
208225

209226
/**

0 commit comments

Comments
 (0)