https://hacknote.jp/archives/27471/
に関連する内容です。
react-native-fetch-blob と react-native-image-picker とを利用して
- 画像を選択してアップロード
- カメラで画像を撮影してアップロード
する時のパターンです。
検証環境
react-native-image-picker: 0.26.3
react-native-fetch-blob: 0.10.5
Android: 6.0.0(API 23)
iPhone: 9.3.5
の検証環境になります。
Androidカメラ
ImagePicker.launchCameraのレスポンス
"path": "/storage/emulated/0/Pictures/image-XX.jpg", "uri": "content://your.app.name.provider/app_images/Pictures/image-XXX.jpg",
上記の path のパラメータを渡すようにします。
const body = [ { name: 'icon', filename: 'file.jpg', type: 'image/jpeg', data: RNFetchBlob.wrap(path), },
Android画像選択
ImagePicker.launchImageLibraryのレスポンス
"path": "/storage/emulated/0/Download/serita_XXX.png", "uri": "content://media/external/images/media/112",
上記の path のパラメータを渡すようにします。
const body = [ { name: 'icon', filename: 'file.jpg', type: 'image/jpeg', data: RNFetchBlob.wrap(path), },
iOSカメラ
ImagePicker.launchCameraのレスポンス
uri: 'file:///var/mobile/Containers/Data/Application/XXX/Documents/images/XXX.jpg',
上記の uri のパラメータから file:// のprefixを削除したものを渡すようにします。
const body = [ { name: 'icon', filename: 'file.jpg', type: 'image/jpeg', data: RNFetchBlob.wrap(uri.replace('file://', '')), },
iOS画像選択
ImagePicker.launchImageLibraryのレスポンス
origURL: 'assets-library://asset/asset.JPG?id=XXX&ext=JPG', uri: 'file:///var/mobile/Containers/Data/Application/XXX/Documents/images/XXX.jpg', path: undefined
上記の origURL のパラメータを渡すようにします。
const body = [ { name: 'icon', filename: 'file.jpg', type: 'image/jpeg', data: RNFetchBlob.wrap(origURL), },
参考
https://github.com/wkh237/react-native-fetch-blob/issues/287
https://github.com/facebook/react-native/issues/5308
https://github.com/wkh237/react-native-fetch-blob/issues/338