En php, quiero descargar un s3 archivo en el navegador sin necesidad de guardarlo en mi servidor

StackOverflow https://stackoverflow.com/questions/772505

Pregunta

Tengo los archivos en Amazon S3.Se nombran con un IDENTIFICADOR único por lo que no hay duplicados.Yo soy de acceder a ellos usando un autorizado de la dirección URL.Tengo que ser capaz de pasar a través del navegador, pero necesito cambiar el nombre de ellos.Ahora mismo estoy usando fopen, pero es descargar el archivo a mi servidor antes de servir el archivo en el navegador.¿Cómo puedo tener los archivos "pasar por" mi servidor para el navegador?O ¿cómo puedo búfer de la descarga de la descarga de un pequeño trozo de mi servidor y que pase a el navegador mientras se descarga el siguiente fragmento?

También me gustaría utilizar CloudFront pero no ofrecen Url autenticados.Creo que puedo usar CURL para enviar las credenciales de la solicitud - ¿puedo hacer este tipo de "pasar por" servicio de archivos con CURL?

Gracias!

¿Fue útil?

Solución

No estoy familiarizado con la forma S3 funciona, así que no sé si esta solución es posible.Pero no podía simplemente redirigir el navegador del usuario para el archivo?Si entiendo correctamente, S3 permite crear direcciones Url de la web para cualquiera de los archivos en el depósito.Así que si, por ejemplo, estas son las descargas de pago, entonces usted podría han S3 generar una URL temporal para que descargar y, a continuación, retire de que una vez que el usuario ha descargado.

Si eso no es una opción, usted puede probar estas Clases PHP:

  • Protocolo HTTP de cliente - Una clase que implementa las peticiones HTTP de los recursos (utilizados por el debajo de la envoltura).Permite que las solicitudes para ser escuchados.
  • gHttp - Una secuencia HTTP contenedor que permite tratar HTTP remoto recursos como archivos, el uso de funciones como fopen(), fread(), etc.
  • Amazon S3 Envoltura - Amazon S3 envoltura por el mismo desarrollador como gHttp.También permite remoto a los recursos a que se accede comunes, como los archivos a través de fopen('s3://...').

Editar:

Esta página tiene la info sobre cómo "pre-authenticate" una solicitud mediante la codificación de la clave de autenticación en la URL.Es bajo la sección titulada: La Cadena De Consulta De Solicitud De Autenticación Alternativos.

// 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;

A continuación, sólo redirigir al usuario a $url, y deben ser capaces de descargar el archivo.La firma está codificada por un camino de un solo esquema de cifrado (sha1), por lo que no hay riesgo de que su AWS Clave de Acceso Secreta de ser descubierto.

Otros consejos

¿Ha intentado utilizar estado http_get, con request_options para especificar el httpauth y httpauthtype? Aunque no recuerdo si este método supone un tipo válido cadena, que podría no funcionar para así binaria.

Si esto tiene éxito, entonces usted debe ser capaz de proporcionar el tipo MIME correcto y escribir en el navegador.

¿Usted ha intentado bu simplemente usando readfile ( " http: // usuario: contraseña @ host / nombre de archivo. ext ")?

Eso se acaba de derivación y escribir directamente a la OutputBuffer, sin embargo, si el tipo de contenido es de interés tiene que comprobar que en primer lugar.

Uso en URL como argumento para readfile también requiere que PHP está compilado con urlwrapper-apoyo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top