我正在服务器上使用
生成一个AWS S3预签名post对象。然后,我试图使用预签名的post url&字段使用fetch从客户机直接上传一个文件到S3 bucket,但得到的是S3.createPresignedPost()
403 PROBIDE
。
我尝试手动将表单字段添加到FormData对象中,以直接匹配以下示例:https://docs.aws.amazon.com/amazons3/latest/api/sigv4-post-example.html,但仍然收到403错误。
用于生成post对象的服务器端函数
const AWS = require("aws-sdk/global"); const S3 = require("aws-sdk/clients/s3"); const uuidv4 = require("uuid/v4"); AWS.config.update({ accessKeyId: process.env.S3_KEY_ID, secretAccessKey: process.env.S3_SECRET_KEY, region: "us-east-1" }); const s3 = new S3(); const getPresignedPostData = (bucket, directory) => { const key = `${directory}/${uuidv4()}`; const postData = s3.createPresignedPost({ Bucket: bucket, Fields: { Key: key, success_action_status: "201" }, Conditions: [{ acl: "public-read" }], ContentType: "image/*", Expires: 300 }); return postData; };
返回以下内容:
{ fields: { Key: "5cd880a7f8b0480b11b9940c/86d5552b-b713-4023-9363-a9b36130a03f" Policy: {Base64-encoded policy string} X-Amz-Algorithm: "AWS-HMAC-SHA256" X-Amz-Credential: "AKIAI4ELUSI2XMHFKZOQ/20190524/us-east-1/s3/aws4_request" X-Amz-Date: "20190524T200217Z" X-Amz-Signature: "2931634e9afd76d0a50908538798b9c103e6adf067ba4e60b5b54f90cda49ce3" bucket: "picture-perfect-photos" success_action_status: "201" }, url: "https://s3.amazonaws.com/picture-perfect-photos" }
我的客户端函数看起来像:
const uploadToS3 = async ({ fields, url }, file) => { const formData = new FormData(); Object.keys(fields).forEach(key => formData.append(key, fields[key])); formData.append("file", file); try { const config = { method: "POST", body: formData }; const response = await fetch(url, config); if (!response.ok) { throw new Error(response.statusText); } const data = await response.json(); return data; } catch (err) { console.log(err.message); } };
我的S3桶CORS配置如下:
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
我希望得到当success_action_status:“201”
设置时发送的XML文档,但我一直在得到403禁止
我刚经历过同样的问题。
将
和
添加到S3控制台中的S3桶的CORS规则中。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>Content-*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
向服务器发出post请求以获取预签名的S3 URL。post请求应在正文中包含文件名和mime类型:
快速路线:
app.post("/s3-signed-url",async (req, res, next)=>{
const s3 = new AWS.S3();
const url = await s3.getSignedUrlPromise('putObject', {
Bucket: "BUCKET_NAME",
Key: req.body.name,
ContentType: req.body.type,
Expires: 60,
ACL: 'public-read',
});
res.json({signedUrl: url})
});
选择要上载的文件时的异步函数中的客户端代码:
async function onFileDrop(file){
const {name, type} = file; // I use react-dropzone to obtain the file.
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({name,type})
}
const rawResponse = await fetch("/s3-signed-url", options)
const {signedUrl} = await rawResponse.json();
// After you obtain the signedUrl, you upload the file directly as the body.
const uploadOptions = { method: 'Put', body: file,}
const res = await fetch(signedUrl, uploadOptions);
if(res.ok) {
return res.json()
}
}
我的致命错误是,在上载带有签名URL的文件时,我在uploadoptions
中添加了冗余头。我遇到其他线程,它们声称我必须显式添加“content-type”头:
`const wrongUploadOptions = { method: 'Put', body: file, headers:{"Content-Type": file.type, "x-amz-acl": public-read}}`
但这在我的情况下是完全没有必要的,这就是我得到403错误的原因。
有谁能告诉我,是否可以直接将文件上传到blob容器,而无需通过我的web服务器进行路由?我在考虑某种客户端JS/jQuery脚本或第三方上传模块,将文件直接流式传输到blob容器。 在Amazon S3中,我使用了一个名为Flajaxian Direct Uploader的组件来实现这一点。 我需要将zip文件上传到一个大小为50MB到200MB的Azure blob容器中,通过web服务器的路由
如何直接从客户端浏览器使用(Azure托管网站)将文件上传到Azure媒体服务?以及使用Azure网站将文件上传到Azure Blob存储,而无需使用任何中间服务器。
我希望能够从开发和生产的前端直接将图像上传到ReactJS公共文件夹。对于生产,我使用带有nodejs后端的heroku应用程序。 从我在网上找到的所有使用ReactJS上传图像的教程中,他们都使用服务器端将图像上传到云,但我想知道是否有可能像Lavarel那样将图像上传到公共文件夹,这样做是否有任何缺点?
问题内容: 首先,我通常不愿发布这个问题,因为我一直觉得互联网上的所有内容都有答案。在花了无数小时寻找这个问题的答案之后,我终于放弃了这个声明。 这有效: 我想做什么? 使用getSignedUrl方法通过PUT(从客户端)将文件上传到Amazon S3 允许任何人查看上载到S3的文件 注意: 如果有一种更简便的方法允许客户端(iPhone)使用预签名的URL(并且不暴露客户端的凭据)将其上传到A
问题内容: 关于此问题,有什么方法可以将[文件从ASP.NET应用程序直接上传到Amazon S3并具有进度条? -—编辑---- 两天后,仍然没有直接的运气。发现了一件看起来很有前途但又不是免费的东西:http : //www.flajaxian.com/ 使用Flash通过进度条直接上传到S3。 问题答案: 我也在寻找解决方案。也许这会有所帮助, 来自AWS Dev Commnity, 但在许
问题内容: 我想将一些文件上传到HTTP服务器。基本上,我需要的是对服务器的某种POST请求,其中包含一些参数和文件。我看到了仅上传文件的示例,但没有找到如何也传递其他参数的示例。 什么是最简单,免费的解决方案?有人有我可以学习的文件上传示例吗?我已经搜寻了几个小时,但是(也许只是那几天)找不到我真正需要的东西。最好的解决方案是不涉及任何第三方类或库的东西。 问题答案: 通常,你会用来触发HTTP