2012-05-22 13 views
6

Quiero cargar un archivo desde una URL externa directamente a un depósito de Amazon S3 utilizando el SDK de PHP. Me las arreglé para hacer esto con el siguiente código:Cargar archivo externo al segmento AWS S3 con PHP SDK

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

Cuando el remote_filesize función es la siguiente:

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"; 
} 

Sin embargo, sería bueno si pudiera saltar establecer el tamaño del archivo para la carga en Amazon desde esto me ahorraría un viaje a mi propio servidor. Pero si elimino la configuración de la propiedad 'longitud' en la función $ s3-> create_object, aparece un mensaje de error que indica que no se puede determinar el tamaño de la secuencia para la carga de la transmisión. ¿Alguna idea de cómo resolver este problema?

Respuesta

0

¿Tiene algún control sobre el servidor/host remoto ?. De ser así, podría configurar un servidor php para consultar el archivo localmente y pasarle los datos.

De lo contrario, podría usar algo como curl para inspeccionar el encabezado como tal;

$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); 

De esta manera, está utilizando una petición HEAD, y no descargar todo el archivo - todavía, del que depende el servidor remoto envía una cabecera Content-longitud correcta.

+0

No tengo control sobre el servidor/host remoto. Ya probé el método sugerido, pero a pesar de que solo solicita el encabezado, redujo considerablemente el proceso. Decidí mover mi servidor a Amazon también (en la misma zona de disponibilidad que el cubo), y ahora está actualizado. – Bjorn

2

Puede cargar archivos de URL directamente a Amazon S3 como esto (mi ejemplo se trata de una imagen jpg):

1. Convierte el contenido del URL en binario

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

2 . Crear un objeto S3 con un cuerpopara pasar el binario en

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

Eso es todo y es muy rápido. ¡Disfrutar!

+3

Con file_get_contents, primero mueve el contenido del archivo a su servidor y luego a S3, lo que no elimina el tráfico adicional – Bjorn

+1

Sí, está en lo cierto. El servidor lee los datos antes de enviarlos a S3 (tráfico adicional y tiempo extra). Pensé que tenías problemas para leer datos de Url. ¿Encontró una solución para enviar contenido directamente a S3? Gracias –

+0

Desafortunadamente no – Bjorn

Cuestiones relacionadas