|
@@ -1,14 +1,16 @@
|
1
|
1
|
# react-native-fetch-blob [](https://badge.fury.io/js/react-native-fetch-blob) 
|
2
|
2
|
|
3
|
|
-A react-native module for fetch file/image with custom headers, supports blob response data, and upload/download progress.
|
|
3
|
+## v0.5.0 Work In Progress README.md
|
4
|
4
|
|
5
|
|
-If you're dealing with image or file server that requires an `Authorization` token in the header, or you're having problem with `fetch` API when receiving blob data, you might try this module (this is also the reason why I made this).
|
|
5
|
+A react-native module for upload, and download file with custom headers. Supports blob response data, upload/download progress, and file reader API that enables you process file content in js context (such as display image data, string or image process).
|
6
|
6
|
|
7
|
|
-See [[fetch] Does fetch with blob() marshal data across the bridge?](https://github.com/facebook/react-native/issues/854).
|
|
7
|
+If you're dealing with image or file server that requires special field in the header, or you're having problem with `fetch` API when receiving blob data, you might try this module.
|
8
|
8
|
|
9
|
|
-This module enables you upload/download binary data in js, see [Examples](#user-content-usage) bellow.
|
|
9
|
+See [[fetch] Does fetch with blob() marshal data across the bridge?](https://github.com/facebook/react-native/issues/854) for the reason why we made this module.
|
10
|
10
|
|
11
|
|
-The source code is very simple, just an implementation of native HTTP request, supports both Android (uses awesome native library [AsyncHttpClient](https://github.com/AsyncHttpClient/async-http-client])) and IOS.
|
|
11
|
+In latest version (v0.5.0), you can upload/download files directly with file path. We've also introduced `file stream` API for reading **large files** from storage, see [Examples](#user-content-usage) bellow.
|
|
12
|
+
|
|
13
|
+This module implements native HTTP request, supports both Android (uses awesome native library [AsyncHttpClient](https://github.com/AsyncHttpClient/async-http-client])) and IOS.
|
12
|
14
|
|
13
|
15
|
## Usage
|
14
|
16
|
|
|
@@ -18,6 +20,8 @@ The source code is very simple, just an implementation of native HTTP request, s
|
18
|
20
|
* [Upload file](#user-content-upload-example--dropbox-files-upload-api)
|
19
|
21
|
* [Multipart/form upload](#user-content-multipartform-data-example--post-form-data-with-file-and-data)
|
20
|
22
|
* [Upload/Download progress](#user-content-uploaaddownload-progress)
|
|
23
|
+ * [Deal with files in storage](#user-content-deal-with-files-in-storage)
|
|
24
|
+ * [Release cache files](#user-content-release-cache-files)
|
21
|
25
|
* [API](#user-content-api)
|
22
|
26
|
|
23
|
27
|
## Installation
|
|
@@ -63,6 +67,66 @@ RNFetchBlob.fetch('GET', 'http://www.example.com/images/img1.png', {
|
63
|
67
|
})
|
64
|
68
|
```
|
65
|
69
|
|
|
70
|
+#### Download to storage directly
|
|
71
|
+
|
|
72
|
+If you want to save the response data directly into file storage rather than convert response data into base64 for some reason.
|
|
73
|
+
|
|
74
|
+Put a `config` before calling `fetch`. There're three options which are `path`, `fileCache`, and `appendExt` that let you decide how and where to save the file.
|
|
75
|
+
|
|
76
|
+The simplest way is give a `fileCach` option to config, and set it to `true`. This will let the incoming response data stored in a temporary path **wihout** any file extension.
|
|
77
|
+
|
|
78
|
+```js
|
|
79
|
+RNFetchBlob
|
|
80
|
+ .config({
|
|
81
|
+ fileCache : true,
|
|
82
|
+ })
|
|
83
|
+ .fetch('GET', 'http://www.example.com/file/example.zip', {
|
|
84
|
+ some headers ..
|
|
85
|
+ })
|
|
86
|
+ .then((res) => {
|
|
87
|
+ // the temp file path
|
|
88
|
+ console.log('The file saved to ', res.path())
|
|
89
|
+ })
|
|
90
|
+```
|
|
91
|
+
|
|
92
|
+But in some cases, you might need a file extension even the file is temporary cached. For instance, when use the file path as source of `Image` element the path should end with something like .png or .jpg, you can do this by put one more option in to `config`.
|
|
93
|
+
|
|
94
|
+```js
|
|
95
|
+RNFetchBlob
|
|
96
|
+ .config({
|
|
97
|
+ fileCache : true,
|
|
98
|
+ appendExt : 'png'
|
|
99
|
+ })
|
|
100
|
+ .fetch('GET', 'http://www.example.com/file/example.zip', {
|
|
101
|
+ some headers ..
|
|
102
|
+ })
|
|
103
|
+ .then((res) => {
|
|
104
|
+ // the temp file path with file extension `png`
|
|
105
|
+ console.log('The file saved to ', res.path())
|
|
106
|
+ // Beware that when using a file path as Image source on Android,
|
|
107
|
+ // you must prepend "file://"" before the file path
|
|
108
|
+ imageView = <Image source={{ uri : Platform.OS === 'android' ? 'file://' : '' + res.path() }}/>
|
|
109
|
+ })
|
|
110
|
+```
|
|
111
|
+
|
|
112
|
+What's more, if you prefer a specific path, rather a random generated path, you can use `path` option. We've added a [getSystemDirs](#user-content-getsysdirs) API in v0.5.0 that lists several common used directories.
|
|
113
|
+
|
|
114
|
+```js
|
|
115
|
+RNFetchBlob.getSystemDirs().then((dirs) => {
|
|
116
|
+ RNFetchBlob
|
|
117
|
+ .config({
|
|
118
|
+ path : dirs.DocumentDir + 'path-to-file.anything'
|
|
119
|
+ })
|
|
120
|
+ .fetch('GET', 'http://www.example.com/file/example.zip', {
|
|
121
|
+ some headers ..
|
|
122
|
+ })
|
|
123
|
+ .then((res) => {
|
|
124
|
+ // the path should be dirs.DocumentDir + 'path-to-file.anything'
|
|
125
|
+ console.log('The file saved to ', res.path())
|
|
126
|
+ })
|
|
127
|
+})
|
|
128
|
+```
|
|
129
|
+
|
66
|
130
|
#### Upload example : Dropbox [files-upload](https://www.dropbox.com/developers/documentation/http/documentation#files-upload) API
|
67
|
131
|
|
68
|
132
|
`react-native-fetch-blob` will convert the base64 string in `body` to binary format using native API, this process will be done in a new thread, so it's async.
|
|
@@ -87,6 +151,29 @@ RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', {
|
87
|
151
|
})
|
88
|
152
|
```
|
89
|
153
|
|
|
154
|
+#### Upload a file from storage
|
|
155
|
+
|
|
156
|
+If you're going to use a `file` in file system as request body, just push the path with prefix `RNFetchBlob-file://`.
|
|
157
|
+
|
|
158
|
+```js
|
|
159
|
+RNFetchBlob.fetch('POST', 'https://content.dropboxapi.com/2/files/upload', {
|
|
160
|
+ Authorization : "Bearer access-token...",
|
|
161
|
+ 'Dropbox-API-Arg': JSON.stringify({
|
|
162
|
+ path : '/img-from-react-native.png',
|
|
163
|
+ mode : 'add',
|
|
164
|
+ autorename : true,
|
|
165
|
+ mute : false
|
|
166
|
+ }),
|
|
167
|
+ 'Content-Type' : 'application/octet-stream',
|
|
168
|
+ }, 'RNFetchBlob-file://' + PATH_TO_THE_FILE)
|
|
169
|
+ .then((res) => {
|
|
170
|
+ console.log(res.text())
|
|
171
|
+ })
|
|
172
|
+ .catch((err) => {
|
|
173
|
+ // error handling ..
|
|
174
|
+ })
|
|
175
|
+```
|
|
176
|
+
|
90
|
177
|
#### Multipart/form-data example : Post form data with file and data
|
91
|
178
|
|
92
|
179
|
In `version >= 0.3.0` you can also post files with form data, just put an array in `body`, with object elements with property `name`, `data`, and `filename`(optional).
|
|
@@ -115,6 +202,30 @@ Elements have property `filename` will be transformed into binary format, otherw
|
115
|
202
|
})
|
116
|
203
|
```
|
117
|
204
|
|
|
205
|
+What if some fields contains a file in file storage ? Just like [upload a file from storage](#user-content-upload-a-file-from-storage) example, change the `data` to path of the file with a prefix `RNFetchBlob-file://`
|
|
206
|
+
|
|
207
|
+```js
|
|
208
|
+
|
|
209
|
+ RNFetchBlob.fetch('POST', 'http://www.example.com/upload-form', {
|
|
210
|
+ Authorization : "Bearer access-token",
|
|
211
|
+ otherHeader : "foo",
|
|
212
|
+ 'Content-Type' : 'multipart/form-data',
|
|
213
|
+ }, [
|
|
214
|
+ // append field data from file path
|
|
215
|
+ { name : 'avatar', filename : 'avatar.png', data: 'RNFetchBlob-file://' + PATH_TO_THE_FILE},
|
|
216
|
+ // elements without property `filename` will be sent as plain text
|
|
217
|
+ { name : 'name', data : 'user'},
|
|
218
|
+ { name : 'info', data : JSON.stringify({
|
|
219
|
+ mail : 'example@example.com',
|
|
220
|
+ tel : '12345678'
|
|
221
|
+ })},
|
|
222
|
+ ]).then((resp) => {
|
|
223
|
+ // ...
|
|
224
|
+ }).catch((err) => {
|
|
225
|
+ // ...
|
|
226
|
+ })
|
|
227
|
+```
|
|
228
|
+
|
118
|
229
|
#### Upload/Download progress
|
119
|
230
|
|
120
|
231
|
In `version >= 0.4.2` it is possible to know the upload/download progress.
|
|
@@ -184,10 +295,11 @@ When `fetch` success, it resolve a `FetchBlobResponse` object as first argument.
|
184
|
295
|
|
185
|
296
|
| Version | |
|
186
|
297
|
|---|---|
|
187
|
|
-| 0.3 | Upload/Download octet-stream and form-data |
|
188
|
|
-| 0.4 | Add base-64 encode/decode library and API |
|
|
298
|
+| ~0.3.0 | Upload/Download octet-stream and form-data |
|
|
299
|
+| 0.4.0 | Add base-64 encode/decode library and API |
|
189
|
300
|
| 0.4.1 | Fixe upload form-data missing file extension problem on Android |
|
190
|
301
|
| 0.4.2 | Supports upload/download progress |
|
|
302
|
+| 0.5.0 | Upload/download with direct access to file storage, and also supports read file with file stream |
|
191
|
303
|
|
192
|
304
|
### Upcoming Features
|
193
|
305
|
|
|
@@ -199,5 +311,5 @@ We are now working on v0.5.0, there will be some new features.
|
199
|
311
|
|
200
|
312
|
### Development
|
201
|
313
|
|
202
|
|
-If you're insterested in hacking this module, check our [development guide](https://github.com/wkh237/react-native-fetch-blob/wiki/Development-Guide), there might be something helpful.
|
|
314
|
+If you're insterested in hacking this module, check our [development guide](https://github.com/wkh237/react-native-fetch-blob/wiki/Development-Guide), there might be something helpful.
|
203
|
315
|
Please feel free to make a PR or file an issue.
|