2012-05-22 4 views
6

Ich möchte eine Datei von einer externen URL mithilfe des PHP SDK direkt in einen Amazon S3-Bucket hochladen. Ich schaffte dies mit dem folgenden Code zu tun:Laden Sie eine externe Datei mit dem PHP SDK in den AWS S3-Bucket.

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $destination, array(
    'fileUpload' => $source, 
    'length' => remote_filesize($source), 
    'contentType' => 'image/jpeg' 
)); 

Wo die Funktion remote_filesize ist die folgende:

function remote_filesize($url) { 
    ob_start(); 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    $ok = curl_exec($ch); 
    curl_close($ch); 
    $head = ob_get_contents(); 
    ob_end_clean(); 
    $regex = '/Content-Length:\s([0-9].+?)\s/'; 
    $count = preg_match($regex, $head, $matches); 
    return isset($matches[1]) ? $matches[1] : "unknown"; 
} 

Allerdings wäre es schön, wenn ich überspringen könnte die Dateigröße einstellen, wenn Amazon das Hochladen seit Das würde mir eine Reise zu meinem eigenen Server ersparen. Aber wenn ich die Eigenschaft 'length' in der $ s3-> create_object -Funktion lösche, bekomme ich eine Fehlermeldung, dass 'Die Stream-Größe für den Streaming-Upload kann nicht bestimmt werden'. Irgendwelche Ideen, wie man dieses Problem löst?

Antwort

0

Haben Sie eine Kontrolle über Remote-Server/Host ?. Wenn ja, könnten Sie einen PHP-Server einrichten, um die Datei lokal abzufragen und die Daten an Sie weiterzuleiten.

Wenn nicht, könnten Sie etwas wie curl verwenden, um den Header wie folgt zu überprüfen;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Auf diese Weise Sie verwenden eine HEAD-Anfrage, und nicht die gesamte Datei heruntergeladen - nach wie vor, Sie sind abhängig von dem Remote-Server einen richtigen Content-Length-Header senden.

+0

Ich habe keine Kontrolle über den Remote-Server/Host. Ich habe bereits die vorgeschlagene Methode ausprobiert, aber obwohl sie nur den Header anfordert, verlangsamte sie den Prozess erheblich. Ich habe beschlossen, meinen Server ebenfalls auf Amazon zu verschieben (in der gleichen Verfügbarkeitszone wie der Bucket), und jetzt ist es auf dem neuesten Stand. – Bjorn

2

Sie können von einer URL laden direkt zu Amazon S3 wie folgt aus (mein Beispiel ist etwa ein jpg Bild):

1. Konvertieren Sie die Inhalte von URL in binären

$binary = file_get_contents('http://the_url_of_my_image.....'); 

2 . ein S3-Objekt mit einem Körper in dem binären

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $filename, array(
    'body' => $binary, // put the binary in the body 
    'contentType' => 'image/jpeg' 
)); 
erstellen passieren

Das ist alles und es ist sehr schnell. Genießen!

+3

Mit file_get_contents verschieben Sie zuerst den Inhalt der Datei auf Ihren Server und dann zu S3, wodurch der zusätzliche Datenverkehr nicht beseitigt wird. – Bjorn

+1

Ja, Sie haben Recht. Der Server liest Daten vor dem Senden an S3 (zusätzlicher Datenverkehr und zusätzliche Zeit). Ich dachte, Sie haben Probleme, Daten von Url zu lesen. Haben Sie eine Lösung gefunden, um Inhalte direkt an S3 zu senden? Danke –

+0

Leider nicht – Bjorn

Verwandte Themen