Php, benim sunucu üzerinde saklanması olmadan tarayıcı bir s3 dosyayı indirmek istiyorum

3 Cevap php

Amazon'un S3 dosyaları var. Hiçbir çiftleri vardır bu yüzden benzersiz bir kimlik ile adlandırılır. Ben yetkili bir URL kullanarak erişmek ediyorum. Ben tarayıcısı onları geçmek gerekiyor, ama ben onları yeniden adlandırmak gerekir. Şu anda Fopen kullanıyorum, ama bu dosyayı tarayıcıya hizmet öncesi benim sunucuya dosyasını indiriyor. Nasıl tarayıcı benim sunucu dosyaları 'aracılığıyla pass' olabilir? Veya nasıl indir tampon yok - benim sunucusuna küçük bir kısmını indirdikten ve sonraki öbek indirirken tarayıcı olduğunu geçmek?

Ayrıca - Gerçekten CloudFront kullanmak istiyorum ama onlar doğrulanmış URL'leri sunmuyoruz. Ben isteği için kimlik bilgilerini göndermek için CURL kullanabilirsiniz inanıyorum - Ben dosya CURL ile hizmet veren 'geçmek' bu tür yapabilirim?

Teşekkürler!

3 Cevap

Ben S3 nasıl çalıştığını aşina değilim, bu yüzden bu çözüm mümkün olup olmadığını bilmiyorum. Ama sadece dosyaya kullanıcının tarayıcısını yönlendirmek değil mi? Eğer doğru anlamak, S3 size kova dosyaları herhangi bir web URL'ler oluşturmak için olanak sağlar. Yani diyelim ki, bu o zaman olabilir have S3 generate a temporary URL for that download, indirme ödenen ve sonra kullanıcı bunu indirildikten sonra ki kaldırmak vardır, eğer.

Bu bir seçenek değilse, bu PHP Sınıfları deneyebilirsiniz:

  • HTTP protocol client - (aşağıda akışı sarıcı tarafından kullanılan) HTTP kaynaklara isteklerini uygulayan bir sınıf. Istekleri yayınlanmasına olanak verir.
  • gHttp - Sen fopen(), fread(), vb gibi fonksiyonları kullanarak, dosyalar gibi uzak HTTP kaynaklarını tedavi sağlayan bir HTTP akışı sarıcı
  • Amazon S3 Stream Wrapper - gHttp olarak aynı geliştirici tarafından bir Amazon S3 akım sarıcı. Ayrıca uzaktan kaynaklar fopen('s3://...') aracılığıyla sıradan dosyalar erişilebilir sağlar.


Edit:

This page üzerine bilgi vardır nasıl "pre-Authenticate" URL doğrulama anahtarı kodlayan bir isteği için. Bu başlıklı bölüm altında bulunuyor: Query String Request Authentication Alternative.

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

Sonra sadece $url için kullanıcıyı yönlendirmek ve bunlar dosya indirmek mümkün olmalıdır. Imza bir tek yönlü şifreleme şeması (sha1) tarafından kodlanan, böylece AWS Gizli Erişim Anahtarı ortaya olma riski yoktur edilir.

Eğer httpauth ve httpauthtype belirtmek için request_options ile, http_get kullanarak denediniz mi? Bu yöntem iyi bir ikili için işe yaramayabilir bir dize geçerli türü, varsayar, ben hatırlamıyorum da.

Bu başarılı olursa, o zaman doğru MIME türünü sağlamak ve tarayıcıya yazmak gerekir.

Sadece ("ana / filename.ext @ http://username:password") readfile kullanarak met denediniz mi?

Bu içerik türü endişe ise ancak birinci olduğunu doğrulamak gerekir, sadece bypass olacak ve outputbuffer doğrudan yazabilirsiniz.

Readfile argümanı da PHP urlwrapper-desteği ile derlenmiş olması gerekir gibi bir URL tr kullanma.