网络请求失败对 https 图像上传 Android 做出本机反应

Posted

技术标签:

【中文标题】网络请求失败对 https 图像上传 Android 做出本机反应【英文标题】:network request failed react native on https image upload Android 【发布时间】:2020-04-08 14:17:20 【问题描述】:

我正在尝试通过 fetch api 上传图片,但在真实设备 android 上出现 Network request failed 错误。 我也尝试了很多来自谷歌的建议,但对我没有任何帮助。

我的依赖是:

"react-native": "0.62.0",
"axios": "^0.19.2",
"form-data": "^3.0.0",
"react": "16.11.0",
"react-redux": "^7.2.0",
"redux": "^4.0.5",
"redux-thunk": "^2.3.0"

我的sn-ps用于上传图片:


const imagePick = () => 
          const formData = new FormData();

        try 

            const options = 
                title: 'Select Avatar',
                storageOptions: 
                  skipBackup: true,
                  path: 'images',
                ,
              ;

            ImagePicker.showImagePicker(options, (response) => 

                formData.append('avatar', 
                    uri: response.uri,
                   type: response.type, 
                   name: response.fileName,
                 )

                fetch(url,  
                    method: 'POST',
                    headers: 
                        'Accept': 'application/json',
                        'Content-Type': 'multipart/form-data',
                        'Authorization': `Bearer $authToken`
                    ,
                    body: formData
                )
                .then(res => 
                    console.log(res.status)
                )
                .catch(e => 
                    console.log(e)
                )

            );

         catch (e) 
            toast("Unable to upload profile photo")
        
      

我也在使用安全的 https url;

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,但我猜这个问题与 axios 库无关,而是因为 React Native 本身。

这里提到comment,是因为Flipper

所以在 React Native 使用它之前,您可以在 MainApplication.java 中的下面提到的行中发表评论

initializeFlipper(this, getReactNativeHost().getReactInstanceManager());

要评论,请将 // 放在上面一行的前面

//initializeFlipper(this, getReactNativeHost().getReactInstanceManager());

【讨论】:

Expo 等托管工作流的解决方案 ...【参考方案2】:

很长一段时间都有同样的问题。答案很简单。该代码适用于 iOS,但有趣的是在 android 上却失败了。

对于 android,更改为:

formData.append('avatar', 
    uri: response.uri,
    type: response.type, 
    name: response.fileName,
)

到:

formData.append('avatar', 
    uri: response.uri,
    type: `image/$response.type`, 
    name: response.fileName,
)

对我来说,图像 mime 类型导致 axios 失败。没有 iOS 上的图像 mime 类型也可以正常工作。

【讨论】:

以上是关于网络请求失败对 https 图像上传 Android 做出本机反应的主要内容,如果未能解决你的问题,请参考以下文章

上传大图像时网络连接中止后恢复或重新启动ajax请求?

https的网站怎么请求http的接口

为啥我的文件夹对网络不可见?或可上传?

如何让 node.js 服务器对来自亚马逊网络服务的请求进行签名以获取优质上传者?

无法使用 AFNetworking 3.0 上传图像

EasyNVR上传ssl证书时出现报错网络请求失败问题的排查