我正在尝试通过过期的URL访问S3资源时优雅地处理403.目前它返回一个amz xml错误页面.我上传了一个403.html资源,并认为我可以重定向到该资源.
存储区资源是我的应用程序保存/提取的资产.仍然,阅读文档我设置存储桶属性以将存储桶作为静态网页页面处理,并将403.html上传到存储桶根目录.除了对资源403.html的公共GET访问权限外,所有公共权限都被阻止.在存储桶属性,网站设置中,我将403.html指示为错误页面.http://<bucket>.s3-website-us-east-1.amazonaws.com/some-asset.html
正确访问重定向到http://<bucket>.s3-website-us-east-1.amazonaws.com/403.html
但是,当我使用aws-sdk js/node和call方法getSignedUrl('getObject', params)
生成签名的url时,它会返回不同的主机url:https://<bucket>.s3.amazonaws.com/
从此方法访问过期的资源不会被重定向到403.html.我猜测,由于主机地址不同,这就是它不会自动重定向的原因.
我还为条件设置了静态网站路由规则
<Condition>
<HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<ReplaceKeyWith>403.html</ReplaceKeyWith>
</Redirect>
Run Code Online (Sandbox Code Playgroud)
仍然没有重定向签名的网址.所以我不知道如何优雅地处理这些过期的网址.任何帮助将不胜感激.
amazon-s3 amazon-web-services http-status-code-403 pre-signed-url
我正在开发 Flutter 应用程序,在其中使用预签名 URL 将图像文件(PUT 请求)上传到 AWS S3。上传成功,因为我可以在 S3 中看到文件。但是当我单击并从存储桶中下载它时,下载的文件已损坏。
我正在使用 Dio 库上传文件。通过邮递员将图像文件上传为二进制文件非常有效
uploadFileToPresignedS3(
File payload, String fileName, String presignedURL) async {
try {
Dio dio = new Dio();
FormData formData = new FormData.from(
{"name": fileName, "file1": new UploadFileInfo(payload, fileName)});
dio.put(presignedURL, data: formData);
} catch (ex) {
print(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
预期:上传的文件不会被破坏
实际结果:上传的文件已损坏
我正在使用cordova文件传输来使用签名网址从aws s3下载文件,因为cordova filetransfer对uri进行编码,签名中的"%"将转换为"%25",从而导致签名不匹配
amazon-s3 file-transfer amazon-web-services cordova pre-signed-url
我尝试过,如果我使用访问密钥,它工作正常,但我试图获取访问密钥并使用角色,但是一旦我获取访问密钥。我得到的回报是www.aws.amazon.com
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const params = {Bucket: config.bucket, Expires: config.time, Key};
const url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url);
Run Code Online (Sandbox Code Playgroud)
我什至通过进入我的 ec2 并运行 cli 命令来确保我的角色设置正确,aws s3 presign s3://bucket/path/file
该命令工作正常,我得到了签名的 url 作为回报,所以这意味着我的角色是正确的,不是吗?
预先感谢您的任何建议/帮助。
我想在私有 AWS S3 存储桶上托管文件,只有通过我的 Web 应用程序身份验证的用户才能访问该存储桶。这些文件下载的链接必须是静态的。
简单的代理方法:
我知道这可以使用代理服务来完成。在这种情况下,静态链接将指向该服务,并且该服务将处理请求用户会话的验证,如果它有效,该服务将使用来自 S3 的文件内容进行响应。
预签名 URL 代理方法:
但是,与其实施代理来控制对文件的访问,我想知道是否可以以某种方式使用预先签名的 URL?
https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html
在这种情况下,代理的作用只是向用户返回一个预先签名的 URL,而不是来自 S3 的文件的实际负载。然后,最终用户可以使用这个预先签名的 URL 直接从 S3 下载文件。我不清楚的是如何在浏览器中管理此流程,我假设我需要将 JavaScript 编写为以下内容:
我在正确的轨道上吗?
我有一个过程,我获得了一个在 5 分钟后过期的存储桶的签名 url。一旦我得到签名的 url,我就开始将文件上传到存储桶。
可以说,完全上传文件需要 6 分钟。会发生什么?
到期时间是指操作(例如下载、上传)何时可以开始还是指操作何时完成?
我正在尝试将文件上传到客户的 S3 中。我获得了一个预签名 URL,允许我执行请求PUT
。我无权访问他们的访问权限和密钥,因此不可能使用 AWS SDK。
用例是我正在使用 gRPC 服务器流调用并将其转换为带有一些字段更改的 csv。当呼叫传入时,我希望能够将转换后的 gRPC 响应流式传输到 S3 中。我需要通过流式传输来完成此操作,因为响应可能会变得相当大,超过 100mb,因此在将所有内容上传到 S3 之前将其加载到内存中并不理想。有任何想法吗?
我正在尝试为 S3 上的私有文件 test.png 创建一个预先签名的 URL。我的代码:
var AWS = require('aws-sdk');
AWS.config.region = 'eu-central-1';
const s3 = new AWS.S3();
const key = 'folder/test.png';
const bucket = 'mybucket';
const expiresIn = 2000;
const params = {
Bucket: bucket,
Key: key,
Expires: expiresIn,
};
console.log('params: ', params);
console.log('region: ', AWS.config.region);
var url = s3.getSignedUrl('getObject', params);
console.log('url sync: ', url);
s3.getSignedUrl('getObject', params, function (err, urlX) {
console.log("url async: ", urlX);
});
Run Code Online (Sandbox Code Playgroud)
它在控制台中返回一个 URL。当我尝试访问它时,它显示
<Error>
<Code>AuthorizationQueryParametersError</Code>
<Message>
Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, …
Run Code Online (Sandbox Code Playgroud) 如何使用签名 URL 将文件上传到 S3?
我尝试了以下方法:
const AWS = require('aws-sdk');
const s3 = new AWS.S3({ accessKeyId: "", secretAccessKey: "" });
const url = s3.getSignedUrl("putObject", {
Bucket: "SomeBucketHere",
Key: "SomeNameHere",
ContentType: "binary/octet-stream",
Expires: 600
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试按照以下步骤使用 Postman 上传时,出现错误SignatureDoesNotMatch
。
binary
单选按钮),选择文件,选择要上传的文件我可以确认 IAM 权限不是这里的问题。我可以完全访问存储桶。
出了什么问题以及如何测试我的签名 URL?
我正在使用预签名的 URL 将文件上传和下载到 S3 存储桶。我遇到了这两种方法generate_presigned_url('put_object')
和generate_presigned_post
.
这两种方法有什么区别?
# upload a file to a bucket with generate_presigned_url with put object
s3_client.generate_presigned_url('put_object', Params= {'Bucket': "BUCKET_NAME",
"Key":"OBJECT_KEY"},
ExpiresIn=3600)
# upload a file to a bucket using presigned post
s3_client.generate_presigned_post(Bucket="BUCKET_NAME", Key="OBJECT_PATH",
ExpiresIn=3600)
Run Code Online (Sandbox Code Playgroud)
有人可以解释两者之间的区别吗?
如果我们有generate_presigned_post
为什么首先有一种上传generate_presigned_url
方法put_object
。
注意:我知道这generate_presigned_post
是推荐的文件上传方法,我也使用过。但是,没有关于这些方法之间区别的明确文档。
amazon-s3 amazon-web-services python-3.x pre-signed-url boto3
amazon-s3 ×10
pre-signed-url ×10
node.js ×2
aws-sdk ×1
boto3 ×1
bucket ×1
cordova ×1
flutter ×1
javascript ×1
postman ×1
python-3.x ×1
upload ×1