[英]Sending file direct from browser to S3 but changing file name
我使用已簽名的授權S3上傳,以便用戶可以直接從瀏覽器上傳文件到S3繞過我的服務器。 這目前有效,但文件名與用戶機器上的文件名相同。 我想把它作為一個不同的名字保存在S3上。
我發布到亞馬遜的formdata看起來像這樣:
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/myFile.mov
它最終為: https://s3.amazonaws.com/mybucket/path/inside/bucket/theirFile.mov
: https://s3.amazonaws.com/mybucket/path/inside/bucket/theirFile.mov
請注意它有自己的文件名,但我的基本路徑。
我希望它也有我指定的文件名。
更新:更新:這一直在工作我只是有其他代碼從一個桶復制到另一個桶恢復原始文件名,從而使我困惑。
您確定targetPath
的內容以及該數據的來源嗎?
您描述的行為是在targetPath
實際上不包含/path/inside/bucket/myFile.mov
特定情況下應該發生的行為。
我建議targetPath
實際上包含值/path/inside/bucket/${filename}
- 我的意思是,字面上,字符$ { filename }
位於該字符串的末尾,而不是您想要的文件名。
如果這是真的,那就是它應該如何運作。
如果您不知道用戶將上載的文件的名稱,則鍵值可以包含特殊變量
${filename}
,該變量將替換為上載文件的名稱。 例如,如果用戶上傳名為Birthday Cake.jpg
的文件,則鍵值uploads/${filename}
將成為對象名稱uploads/Birthday Cake.jpg
Birthday Cake.jpg
。
如果使用要在S3中看到的文字文件名填充該變量,則上傳應該按預期運行,使用文件名而不是上傳者計算機上的文件名。
此外,更安全的方法是消除策略中的關鍵'starts-with'
邏輯,而是使用您希望用戶上載的特定密鑰為每個上載事件明確簽署策略(動態)。 否則,利用此表單來覆蓋同一密鑰前綴中的其他文件並非不可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.