我正在使用带有Expo SDK 37的React Native。我的请求如下:
export const uploadMedia = async (fileData, s3Data) => {
console.log(fileData.type)
let formData = new FormData();
formData.append('key', s3Data.s3Key);
formData.append('Content-Type', fileData.type);
formData.append('AWSAccessKeyId', s3Data.awsAccessKey);
formData.append('acl', 'public-read');
formData.append('policy', s3Data.s3Policy);
formData.append('signature', s3Data.s3Signature);
formData.append('file', fileData.data);
return fetch(`https://...restofendpoint`, {
method: 'POST',
//skipAuthorization: true,
body: formData
})
}
我正在使用预签名POST方法。我从服务器上的另一个端点获得了以下s3数据,可以确认所有正确的信息都被填充了。这在iOS上非常有效,但当尝试在Android上上传时,我会收到以下错误:
Network request failed
- node_moduleswhatwg-fetchdistfetch.umd.js:473:29 in xhr.onerror
- node_modulesevent-target-shimdistevent-target-shim.js:818:39 in EventTarget.prototype.dispatchEvent
- node_modulesreact-nativeLibrariesNetworkXMLHttpRequest.js:574:29 in setReadyState
- node_modulesreact-nativeLibrariesNetworkXMLHttpRequest.js:388:25 in __didCompleteResponse
- node_modulesreact-nativeLibrariesvendoremitterEventEmitter.js:190:12 in emit
- node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:436:47 in __callFunction
- node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:111:26 in __guard$argument_0
- node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:384:10 in __guard
- node_modulesreact-nativeLibrariesBatchedBridgeMessageQueue.js:110:17 in __guard$argument_0
* [native code]:null in callFunctionReturnFlushedQueue
我最初所有的请求都使用axios
,并试图通过切换到fetch
api来查看是否存在问题。没有用。几乎陷入了困境。如有任何帮助,我们将不胜感激。
在论坛地狱深处搜索了很久。。。
当使用FormData
发布数据时,Android很挑剔,需要以下文件数据类型指定为image/jpg
或video/mp4
。
我使用的是Expo
中的ImagePicker
组件,因此它默认返回:
{
type: 'image' || type: 'video',
...other stuff
}
网络请求失败,在我修复此问题后立即得到解决。iOS显然不需要这个要求,所以这就是为什么它在iOS上工作,而不是在Android上。