|
@@ -23,6 +23,7 @@ import com.facebook.react.bridge.WritableMap;
|
23
|
23
|
import java.io.ByteArrayInputStream;
|
24
|
24
|
import java.io.File;
|
25
|
25
|
import java.io.FileInputStream;
|
|
26
|
+import java.io.FileOutputStream;
|
26
|
27
|
import java.io.IOException;
|
27
|
28
|
import java.io.InputStream;
|
28
|
29
|
import java.net.MalformedURLException;
|
|
@@ -311,8 +312,29 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
|
311
|
312
|
switch (responseType) {
|
312
|
313
|
case KeepInMemory:
|
313
|
314
|
try {
|
314
|
|
- byte [] b = resp.body().bytes();
|
315
|
|
- callback.invoke(null, getResponseInfo(resp), android.util.Base64.encodeToString(b,Base64.NO_WRAP));
|
|
315
|
+ // For XMLHttpRequest, automatic response data storing strategy, when response
|
|
316
|
+ // header is not `application/json` or `text/plain`, write response data to
|
|
317
|
+ // file system.
|
|
318
|
+ if(isBlobResponse(resp) && options.auto == true) {
|
|
319
|
+ String dest = RNFetchBlobFS.getTmpPath(ctx, taskId);
|
|
320
|
+ InputStream ins = resp.body().byteStream();
|
|
321
|
+ FileOutputStream os = new FileOutputStream(new File(dest));
|
|
322
|
+ byte [] buffer = new byte[10240];
|
|
323
|
+ int read = ins.read(buffer);
|
|
324
|
+ os.write(buffer,0,read);
|
|
325
|
+ while(read > 0) {
|
|
326
|
+ os.write(buffer,0,read);
|
|
327
|
+ read = ins.read(buffer);
|
|
328
|
+ }
|
|
329
|
+ ins.close();
|
|
330
|
+ os.close();
|
|
331
|
+ WritableMap info = getResponseInfo(resp);
|
|
332
|
+ callback.invoke(null, info, dest);
|
|
333
|
+ }
|
|
334
|
+ else {
|
|
335
|
+ byte[] b = resp.body().bytes();
|
|
336
|
+ callback.invoke(null, getResponseInfo(resp), android.util.Base64.encodeToString(b, Base64.NO_WRAP));
|
|
337
|
+ }
|
316
|
338
|
} catch (IOException e) {
|
317
|
339
|
callback.invoke("RNFetchBlob failed to encode response data to BASE64 string.", null);
|
318
|
340
|
}
|
|
@@ -367,6 +389,13 @@ public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
|
367
|
389
|
return info;
|
368
|
390
|
}
|
369
|
391
|
|
|
392
|
+ private boolean isBlobResponse(Response resp) {
|
|
393
|
+ Headers h = resp.headers();
|
|
394
|
+ boolean isText = !getHeaderIgnoreCases(h, "content-type").equalsIgnoreCase("text/plain");
|
|
395
|
+ boolean isJSON = !getHeaderIgnoreCases(h, "content-type").equalsIgnoreCase("application/json");
|
|
396
|
+ return !(isJSON || isText);
|
|
397
|
+ }
|
|
398
|
+
|
370
|
399
|
private String getHeaderIgnoreCases(Headers headers, String field) {
|
371
|
400
|
String val = headers.get(field);
|
372
|
401
|
if(val != null) return val;
|