我正在尝试在反应原生应用的上下文中将原始图像数据上传到S3。
我的原始数据是正确的,并且在大多数情况下,我认为我的内部反应本机代码正常工作以捕获图像数据。
在我的rails服务器上,我正在使用amazon ruby gem来构建url的详细信息以及将数据发布到相关存储桶所需的相关身份验证数据,然后我将其渲染为react-native,就像常规反应网前端。
# inside the rails server controller
s3_data = S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}/${filename}", success_action_status: '201', acl: 'public-read', url: 'https://jd-foo.s3-us-west-2.amazonaws.com')
render json: {s3Data: {fields: s3_data.fields, url: s3_data.url}}
目前我尝试发布到S3,我正在使用如下的ES6提取来构建我的http请求。
saveImage(data) {
var url = data.url
var fields = data.fields
var headers = {'Content-Type': 'multipart/form-data'}
var body = `x-amz-algorithm=${encodeURIComponent(fields['x-amz-algorithm'])}&` +
`x-amz-credential=${encodeURIComponent(fields['x-amz-credential'])}&` +
`x-amz-date=${encodeURIComponent(fields['x-amz-date'])}&` +
`x-amz-signature=${encodeURIComponent(fields['x-amz-signature'])}&` +
`acl=${encodeURIComponent(fields['acl'])}&` +
`key=${encodeURIComponent(fields['key'])}&` +
`policy=${encodeURIComponent(fields['policy'])}&` +
`success_action_status=${encodeURIComponent(fields['success_action_status'])}&` +
`file=${encodeURIComponent('12foo')}`
console.log(body);
return fetch(url, {method: 'POST', body: body, headers: headers})
.then((res) => {console.log('s3 inside api res', res['_bodyText']) ; res.json()} );
}
身体的记录看起来像
x-amz-algorithm=AWS4-HMAC-SHA256&x-amz-credential=AKIAJJ22D4PSUNBB5RAQ%2F20151027%2Fus-west-1%2Fs3%2Faws4_request&x-amz-date=20151027T223159Z&x-amz-signature=42b09d7ae134f803b10ef72d220fe74a630a3f826c7f1f625448277d0a6d93c7&acl=public-read&key=uploads%2F46be8ca3-6d3a-4bb7-a658-f2c8e058bc28%2F%24%7Bfilename%7D&policy=eyJleHBpcmF0aW9uIjoiMjAxNS0xMC0yN1QyMzozMTo1OVoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJqZC1mb28ifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVwbG9hZHMvNDZiZThjYTMtNmQzYS00YmI3LWE2NTgtZjJjOGUwNThiYzI4LyJdLHsic3VjY2Vzc19hY3Rpb25fc3RhdHVzIjoiMjAxIn0seyJhY2wiOiJwdWJsaWMtcmVhZCJ9LHsieC1hbXotY3JlZGVudGlhbCI6IkFLSUFKSjIyRDRQU1VOQkI1UkFRLzIwMTUxMDI3L3VzLXdlc3QtMS9zMy9hd3M0X3JlcXVlc3QifSx7IngtYW16LWFsZ29yaXRobSI6IkFXUzQtSE1BQy1TSEEyNTYifSx7IngtYW16LWRhdGUiOiIyMDE1MTAyN1QyMjMxNTlaIn1dfQ%3D%3D&success_action_status=201&file=12foo
似乎我的问题可以与两者联系在一起
帖子正文格式不正确,包括特殊字符问题
没有在邮件正文中为S3提供足够的数据,包括密钥和其他信息,文档对于不需要的内容感觉有点不清楚。
S3服务器的错误似乎是
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MalformedPOSTRequest</Code><Message>The body of your POST request is not well-formed multipart/form-data.</Message> <RequestId>DCE88AC349D7B2E8</RequestId><HostId>AKE1xctETuZMAhBFLfyuFlDxikYUlbAC7YufkM7h8Z8eVQdtLA25Z0Od/a4cMUbfW1nWnGjc+vM=</HostId></Error>
我很清楚我的实际问题是什么以及我应该在哪里挖掘。
非常感谢任何输入。
答案 0 :(得分:0)
<Message>The body of your POST request is not well-formed multipart/form-data.</Message>
可能不是您错过了身体的值。这里最重要的问题是你的身体结构与multipart/form-data
不相似。
有关multipart/form-data
的工作原理,请参阅RFC 2388。 (或者找一个为你构建这个的库。)
您发送的内容看起来更像是某些AWS API使用的application/x-www-form-urlencoded
格式,而不是S3。
There is an example in the S3 docs显示示例POST
正文的内容。你应该看到那里有很大的不同。
另请注意,POST
适用于基于浏览器的上传。如果您是从代码中取消,那么您需要做很多额外的工作。 PUT
Object更加直截了当。请求体是二进制文件内容。或者,如果最终由浏览器完成,则使用浏览器进行测试,然后让浏览器构建表单。