2014-10-15 20 views
6

signed authorized S3 uploads kullanıyorum, böylece kullanıcılar dosyaları doğrudan tarayıcılarından S3 sunucumu atlayarak karşıya yükleyebilirler. Bu şu anda çalışır, ancak dosya adı kullanıcının makinesinde olduğu gibidir. S3’e farklı bir isim olarak kaydetmek istiyorum.Tarayıcıdan S3'e dosya gönderme, ancak dosya adının değiştirilmesi

Ben Amazon yayın formdata şuna benzer:

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 

Ancak yerine biten dosyayı: sahip olduğu https://s3.amazonaws.com/mybucket/path/inside/bucket/theirFile.mov

Not: https://s3.amazonaws.com/mybucket/path/inside/bucket/myFile.mov

Sanki biter dosya adları ancak benim temel yolum.

Ayrıca belirttiğim dosya adına sahip olmak isterim.

GÜNCELLEME: Güncelleme: Tüm bu çalışmanın başında, orijinal dosya adını geri yüklediğim ve böylece kafamı karıştırdığım bir kovadan diğerine kopyalanan başka bir kod vardı.

cevap

4

targetPath'un içeriğinden ve verilerin nereden geldiğinden emin misiniz?

Tanımladığınız davranış, targetPath'un aslında /path/inside/bucket/myFile.mov içerdiği belirli bir durumda ne yapılması gerektiğidir.

Ben targetPath aslında değerini /path/inside/bucket/${filename} içerdiğini öneririm - ve ben demek ki tarafından, kelimenin tam anlamıyla, karakterler $ { f i l e n a m e } yerine niyetinde dosya adının o tellerden sonundadır.

Bu doğruysa, bunun tam olarak nasıl çalışması gerekiyordu.

bir kullanıcı Yükleyeceğiniz dosyanın adını bilmiyorsanız, anahtar değeri yüklenen dosyanın adıyla değiştirilecektir özel değişken ${filename} içerebilir. Örneğin, kullanıcı Birthday Cake.jpg adlı bir dosya yüklediğinde, uploads/${filename} anahtar değeri uploads/Birthday Cake.jpg nesne adı olacaktır.

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

Eğer S3 görmek istediğiniz edebi isimle değişken beklediğiniz gibi, daha sonra yüklenenler yükleyicinin bilgisayarında dosya yerine dosya adını kullanarak, davranması gerektiğini doldurmak ederse .


Ayrıca daha güvenli bir yaklaşım politikasında kilit 'starts-with' mantığını ortadan kaldırmak ve bunun yerine açıkça kullanıcı yüklemek istediğiniz belirli anahtar ile, her yüklemenin olay için bir politika (dinamik) imzalamak olacaktır. Aksi takdirde, bu formu aynı anahtar öneki diğer dosyaların üzerine yazmak için kullanmak imkansız değildir.

+0

Sorunum, kullanıcının karşıya yüklediği dosyanın adı ne olursa olsun dosyayı farklı bir ad vermek istiyorum. – Zugwalt

+0

@Zugwalt sağ ...Bu yüzden kodunuzun 'targetPath' içine koydukları şey, S3'teki araziyi görmek istediğiniz literal dosya adıyla sona ermeli, '$ {filename}' değil, ne olduğunu * düşünüyorum * şu an yaptığınız davranışa dayanarak görüyorum. –

+0

'targetPath' şu anda'/path/inside/bucket/myFile.mov' gibi değişmez yoldur. '$ {Filename}' kullanmıyoruz. Ayrıca öneride bulundu ve 'start-with 'yerine' '' '' '' '' tuşunu kullanmak yerine politikada. Hala hayır şans. – Zugwalt