【问题标题】:Sending file direct from browser to S3 but changing file name将文件直接从浏览器发送到 S3 但更改文件名
【发布时间】:2014-12-10 18:21:00
【问题描述】:

我正在使用signed authorized S3 uploads,以便用户可以绕过我的服务器直接从浏览器上传文件到 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

注意它有他们的文件名,但我的基本路径。

我希望它也具有我指定的文件名。

更新:更新:这一直有效我只是将其他代码从一个存储桶复制到另一个存储桶,从而恢复了原始文件名,从而使我感到困惑。

【问题讨论】:

    标签: javascript file file-upload amazon-web-services amazon-s3


    【解决方案1】:

    您确定targetPath 的内容以及该数据的来源吗?

    您所描述的行为是在targetPath 实际上不包含/path/inside/bucket/myFile.mov 的一种特殊情况下应该发生的情况。

    我建议targetPath 实际上包含值/path/inside/bucket/${filename}——我的意思是,字面意思是,字符$ { f i l e n a m e } 位于该字符串的末尾,而不是您想要的文件名。

    如果这是真的,那就是它应该如何工作。

    如果您不知道用户将上传的文件的名称,则键值可以包含特殊变量${filename},该变量将替换为上传文件的名称。例如,如果用户上传一个名为Birthday Cake.jpg的文件,键值uploads/${filename}将变为对象名称uploads/Birthday Cake.jpg

    ——https://aws.amazon.com/articles/1434

    如果您使用您希望在 S3 中看到的文字文件名填充该变量,那么上传应该按照您的预期进行,使用您的文件名而不是上传者计算机上的文件名。


    此外,更安全的方法是在您的策略中消除密钥 'starts-with' 逻辑,而是使用您希望用户上传的特定密钥为每个上传事件显式签署(动态)策略。否则,利用这种形式覆盖相同键前缀内的其他文件并非不可能。

    【讨论】:

    • 我的问题是,无论用户上传的文件名称如何,我都想为文件命名不同的名称。
    • @Zugwalt 对...这就是为什么您的代码放入 targetPath 的内容需要以您希望在 S3 中看到的文字文件名结尾,而不是 ${filename},这就是 根据你看到的行为,我认为你现在正在做。
    • targetPath 现在是文字路径,例如/path/inside/bucket/myFile.mov。根本不使用${filename}。还接受了您的建议,并在政策中而不是使用starts-with,我现在只使用key。还是没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多