在React Native 0.70应用程序中,fetch用于将jpg图片上传到OSS。这是代码:
import ReactNativeBlobUtil from "react-native-blob-util"; //v0.19
fileData = await ReactNativeBlobUtil.fs.readFile(filePath);
// fileData is in binary format. the filePath is something similar to after image picker:
// file:///data/user/0/com.xyz_app6/cache/rn_image_picker_lib_temp_97c732b7-48a1-469b-8df1-d42054e5e070.jpg
response = await fetch(preSignedUrl, {
method: "PUT",
body: fileData,
});
上传失败,出现 403:
在 uploadtooss 中回复:
{
_bodyBlob: {
_data: {
__collector: [Object],
blobId: "56f0bef0-11bb-4b5b-a072-dc70849f0fb6",
offset: 0,
size: 959,
},
},
_bodyInit: {
_data: {
__collector: [Object],
blobId: "56f0bef0-11bb-4b5b-a072-dc70849f0fb6",
offset: 0,
size: 959,
},
},
bodyUsed: false,
headers: {
map: {
connection: "keep-alive",
"content-length": "959",
"content-type": "application/xml",
date: "Fri, 16 Feb 2024 00:36:02 GMT",
server: "AliyunOSS",
"x-oss-ec": "0002-00000040",
"x-oss-request-id": "65CEADF19BB920313243F0CF",
"x-oss-server-time": "77",
},
},
ok: false,
status: 403,
statusText: "",
type: "default",
url: "https://xxxx.oss-cn-hangzhou.aliyuncs.com/22790/fWstDM-1000000022.jpg?OSSAccessKeyId=LTAI5t5axvqwo2qGxxxxxxxx&Expires=1708047351&Signature=haslIgyue9yAG71NG9gkomHqxxxxxxxxxx",
};
也尝试了
base64
格式,错误是一样的:
fileData = await ReactNativeBlobUtil.fs.readFile(filePath, 'base64');
但是,当将相同的预签名 URL 粘贴到 postman 中时,取消选中标头中的 Content-Type,并为正文选择二进制并选择 jpg 文件,发送成功。抓取过程中缺少什么?
在安全性方面,Postman 通常使用自签名证书等来“作弊”一点,使 Postman 在您启动项目时更容易使用。但这并不是实际测试安全相关功能(例如自签名 URL)的好用例。
我真的会检查一下应用程序代码是否存在潜在问题、CORS 问题等,并且不相信 Postman 一切都快正常了。
抱歉我无法提供更多细节...:(