2016-04-14 35 views
1

Amazon S3 ile basit JS görüntü yüklemeyi kurmaya çalışıyorum. Aşağıda benim kodum.Dosyaları, XMLHttpRequest ile Amazon S3 için karşıya yükleyin Genel

JS:

host = "https://s3.eu-central-1.amazonaws.com/my.bucket.url/"; 

uploadAttachment = function(attachment) { 
    file = attachment.file; 
    key = createStorageKey(file); 
    form = new FormData; 
    form.append("key", key); 
    form.append("acl", "public-read"); 
    form.append("Content-Type", file.type); 
    form.append("file", file); 
    xhr = new XMLHttpRequest; 
    xhr.open("PUT", host + key, true); 
    // ... 
    xhr.send(form); 
}; 

createStorageKey = function(file) { 
    var date, day, time; 
    date = new Date; 
    day = date.toISOString().slice(0, 10); 
    time = date.getTime(); 
    return "s3/attachments/" + day + "/" + time + "-" + file.name; 
}; 

S3 Kepçe Politikası:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "1", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": "arn:aws:s3:::my.bucket.url/*" 
     } 
    ] 
} 

S3 CORS:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Her şey alm işleri iyi durumda, ancak yüklenen dosyalar herkese açık değil. Dahası, onları web arayüzünden kamuya alamam bile. Yapabileceğim tek şey onları silmek. Bu dosyaların halka olması için gerçekten ihtiyacım var.

Mümkünse, erişim anahtarlarını kullanmadan gerçekten bunu yapmak isterim.

Herhangi bir yardım gerçekten takdir edilmektedir!

+0

Eğer burada, ne yaptığının farkında mı? Kovanınız anonim yüklemelere açık. Herhangi bir yerden, herhangi bir yerden, kimlik bilgisi gerekli değildir. Bu yüzden nesneleri değiştiremezsin - hatta onlara sahip değilsin ... Ama onlar senin kovaların içinde, yani onlar için para ödüyorsun, bu yüzden onları silme iznin var. Gerçekten geri dönüp imzalama ve kimlik doğrulama isteklerini okumaya ihtiyacın var. Bunu düzeltmeye çalışmayın. Çok daha büyük bir sorunun var. –

+0

Öneriniz için teşekkür ederiz. Neler olduğunu anlıyorum. Sadece çalışmayı ve daha sonra onu tek bir alana sınırlamak istiyorum. Hala herşeyi imzaladığımı mı söylüyorsun? –

+0

@ Michael-sqlbot lütfen açıklığa kavuşturabilir misiniz: İstekleri imzalamadan karşıya yüklenen dosyaları herkese açık hale getirmek mümkün müdür? –

cevap

1

Bunu çözdüm.

JS:

  • my.bucket.s3.eu-central-1.amazonaws.com için host değiştirildi.
  • xhr.open("POST", host, true).
  • Muhtemelen alakasız, ancak acl parametresini kaldırdım.

CORS:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>http://my.website.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

S3 Kepçe Politikası: Ben sadece kaldırıldı.

S3 Kepçe İzinleri: Granted "Upload/Delete permissions to everyone