尝试使用createPresignedPost方法上传到AWS S3,但是看似上传的文件不可见或未在S3存储桶中显示,或者返回“策略条件失败”错误。
需要将文件安全地上传到AWS S3 bucke,所以我尝试在Lambda中生成一个预签名的发布策略。然后,我将策略详细信息复制到测试HTML表单中,然后上传文件。如果我这样输入“ key”参数:<input type="input" name="key" value="datafile/math3/${filename}" />
,将返回“策略条件失败”错误。为什么?这似乎是设置此参数的正确方法。但是,如果我这样设置“密钥”(删除{filename}部分)<input type="input" name="key" value="datafile/math3/" />
,则上传似乎成功。没有错误返回,我什至还看到在S3中创建了文件夹“ datafile / math3” 。但是文件夹下没有文件。如果我检查文件夹的大小,该大小与我尝试上载的文件大致匹配。没有显示任何对象。为什么?
Lambda代码:
var policy;
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'xxxxxxxxxxx', secretAccessKey: 'yyyyyyyyyyyyyyyyyyyyyyy'});
const s3 = new AWS.S3();
const key = 'datafile/math3/';
const params = {
Bucket: 'my-file-store',
Key: key,
Expires: 60*60, // in seconds,
Fields: {
key: key,
}
// Conditions: [
// // {'acl': 'public-read'},
// // ["starts-with", "$key", "datafile/math3/"],
// // {'key': 'datafile/math3/'}
// ]
};
s3.createPresignedPost(params, function(err, data) {
if (err) {
throw err;
}
else {
policy = data;
}
});
return policy;
我在测试模式下运行此lambda代码,然后将必要的信息复制到html代码中。
HTML代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="https://s3.amazonaws.com/my-file-store" method="post" enctype="multipart/form-data">
Key to upload:
<input type="input" name="key" value="datafile/math3/${filename}" /><br />
<!-- <input type="input" name="key" value="datafile/math3/" /><br /> -->
<!-- <input type="hidden" name="acl" value="public-read" /> -->
<!-- <input type="hidden" name="success_action_redirect" value="http://aztopia-file-store.s3.amazonaws.com/successful_upload.html" /> -->
Content-Type:
<!-- <input type="input" name="Content-Type" value="image/jpeg" /><br /> -->
<!-- <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> -->
<!-- <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> -->
<input type="text" name="X-Amz-Credential" value="erzdfgsdfgsddgdffdfffxxxxxx/20190330/us-east-1/s3/aws4_request" />
<input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="text" name="X-Amz-Date" value="20190330T030853Z" />
Tags for File:
<!-- <input type="input" name="x-amz-meta-tag" value="" /><br /> -->
<input type="hidden" name="Policy" value='asdfasfadsfasdfasdfasrheghjfghjfhhjfgjghxxxxxxxxxxxxxxxxxxxxxxxxxxxx==' />
<input type="hidden" name="X-Amz-Signature" value="343rgwgdhgsfgsdfgdgdfgsdfgsdfgsdfgfdyyyyyyyy" />
File:
<input type="file" name="file" /> <br />
<!-- The elements after this will be ignored -->
<input type="submit" name="submit" value="Upload to Amazon S3" />
</form>
</html>
顺便说一句,我在如下所示的存储桶中设置了CORS。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
现在为什么不喜欢这样设置密钥:<input type="input" name="key" value="datafile/math3/${filename}" />
?从所有来源看,{filename}部分似乎都是必需的。
如果我删除$ {filename},我有点知道它不能正确放置对象,因为它不知道文件名。
我在这里想念什么?
另一个可能相关的问题:如果我同时以lambda和html形式添加<input type="hidden" name="acl" value="public-read" />
参数,(现在注释),则会出现“访问被拒绝”错误。为什么会这样?
也尝试了许多其他组合,例如启动条件。无济于事。
非常感谢您的光临!整天都在挣扎。
答案 0 :(得分:0)
我找到了!需要删除字段中的密钥:
https://stackoverflow.com/questions/51757774/aws-s3-policy-condition-failed-eq-key/51888040