我在用签署授权的 S3 上传 https://aws.amazon.com/articles/1434这样用户就可以绕过我的服务器直接从浏览器上传文件到 S3。目前这可以工作,但文件名与用户计算机上的文件名相同。我想将其以不同的名称保存在 S3 上。
我发布到亚马逊的表单数据如下所示:
var formData = new FormData();
formData.append('key', targetPath); // e.g. /path/inside/bucket/myFile.mov
formData.append('AWSAccessKeyId', s3Auth.AWSAccessKeyId); // aws public key
formData.append('acl', s3Auth.acl); // e.g. 'public-read'
formData.append('policy', s3Auth.policy); // s3 policy including ['starts-with', '$key', '/path/inside/bucket/']
formData.append('signature', s3Auth.signature); // base64 sha1 hash of private key and base64 policy JSON
formData.append('success_action_status ', 200); // response code 200 on success
formData.append('file', file.slice()); // e.g. /path/on/user/computer/theirFile.mov
但是,文件的结尾不是:https://s3.amazonaws.com/mybucket/path/inside/bucket/myFile.mov
最终结果是:https://s3.amazonaws.com/mybucket/path/inside/bucket/theirFile.mov
请注意,它有他们的文件名,但有我的基本路径。
我希望它也具有我指定的文件名。
UPDATE:更新:这一直在工作,我只是将其他代码从一个存储桶复制到另一个存储桶,恢复了原始文件名,从而使我感到困惑。
您确定内容targetPath
这些数据来自哪里?
您所描述的行为是在一种特定情况下应该发生的情况targetPath
实际上并不包含/path/inside/bucket/myFile.mov
.
我建议targetPath
实际上包含值/path/inside/bucket/${filename}
——我的意思是,从字面上看,角色$ { f i l e n a m e }
位于该字符串的末尾,而不是您想要的文件名。
如果这是真的,那么它应该是这样工作的。
如果您不知道用户将上传的文件的名称,键值可以包含特殊变量${filename}
它将替换为上传文件的名称。例如,键值uploads/${filename}
将成为对象名称uploads/Birthday Cake.jpg
如果用户上传一个名为Birthday Cake.jpg
.
— https://aws.amazon.com/articles/1434 https://aws.amazon.com/articles/1434
如果您使用您想要在 S3 中看到的文字文件名填充该变量,那么上传的行为应该如您所期望的那样,使用您的文件名而不是上传者计算机上的文件名。
此外,更安全的方法是消除密钥'starts-with'
您的策略中的逻辑,而是使用您希望用户上传的特定密钥为每个上传事件显式签署策略(动态)。否则,利用这种形式覆盖同一键前缀内的其他文件并非不可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)