Uzaktan Dosya PHP Kuvvet indirin

3 Cevap php

Ben Amazon S3 depolama saklanan videoları bir grup var. Kullanıcıların kendi sabit diskinize videoları indirebilirsiniz biri here, çok benzer bir PHP komut dosyası, yaratmaya çalışıyorum.

Ben böyle bir şey kullanmak istiyorum:

<?php
$file_name = $_GET['file'];
$file_url = 'http://www.myamazons3.com/' . $file_name;
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url);
exit;

Video benim sunucu üzerinden geliyor olacak çünkü Ancak, ben bu bant genişliğini artırır izlenimi altında değilim.

Herhangi benim kendi sunucusu üzerinden ilk okuma kaçınarak ben, bu videoların indirme zorlamak mümkün olabilir nasıl fikir?

Çok teşekkürler!

3 Cevap

S3 API Docs bir göz atın, ve ayarlayabilirsiniz başlık değerleri unutmayın. Dosya istendiğinde Amazon bu gönderir: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html (aynı parametreler varolan bir nesneyi güncellemek için bir POST ile gönderilebilir)

Bahsettiğiniz php script Tamam çalışır, ancak ana olumsuz sitenizde bir ziyaretçi bir dosya istediğinde, her zaman, kendi sunucuları S3'ten yükleyin ve ardından tarayıcı bu verileri röle olacaktır. Düşük trafik siteler için, muhtemelen büyük bir anlaşma değil, ama yüksek trafik olanlar için, kesinlikle kendi sunucuları aracılığıyla her şeyi çalıştıran önlemek istiyor.

Neyse ki, S3 indirmek zorunda dosyalarınızı ayarlamak için oldukça düz ileri bir yolu var. Sadece (sadece içerik-eğilim belirleme, bazı tarayıcılarda çalışır, ancak her iki ayar tüm tarayıcılarda çalışması gerekir) içerik türü ve içerik-eğilim ayarlamak istiyorum.

Bu kod undesigned gelen Amazon S3 PHP sınıfını kullanarak olduğunuzu varsayarak:

/ / S3 auth set ve kova listeleme olsun

// then loop through the bucket and copy each file over itself, replacing the "request headers": S3::copyObject($bucketName, $filename, $bucketName, $filename, "public-read", array(), array("Content-Type" => "application/octet-stream", "Content-Disposition" => "attachment"));

>

Şimdi tüm dosyaları indirmek zorunda kalacak. Siz değişiklik görmek için önbelleği temizlemek gerekebilir. Ve tabii ki, aslında tarayıcıda "inline" yüklenmesine istiyorsun herhangi bir dosya üzerinde yapmak yok.

Bu çözüm ile güzel kısmı doğrudan medya dosyalarını yüklemek başvurular, içerik-türü veya içerik eğilim umurumda değil, siz hala tarayıcıda dosyalarını çalabilir ve (gibi Flash'ı bir mp3 çalar diyelim) olduğunu aynı dosyayı indirmek için bir link. Kullanıcı zaten flaş dosyası yüklenirken bitmiş, onlar büyük olasılıkla hala indir süper hızlı olması anlamına gelir ve hatta size S3'ten herhangi bir ekstra bant genişliği ücretleri maliyeti olmayacak ki, onların önbellekte olacak.

Bu eski bir konu olduğunu biliyorum, ama son bir yıl içinde, S3 ekibi istek üzerine belirli HTTP başlıklarını geçersiz kılmak için izin veren, request parameters desteği ekledi.

Siz, örneğin, image/svg+xml gibi bir SVG resim upload, ancak daha sonra application/octet-stream bir indirme zorlamak olarak alınırken başlıkları geçersiz olabilir.

AWS SDK for PHP, bunu başarmak için Aws\S3\S3Client::createPresignedUrl() yöntemini kullanabilirsiniz kullanabilirsiniz.