No sé cómo funciona S3, así que no sé si esta solución es posible. ¿Pero no podría simplemente redirigir el navegador del usuario al archivo? Si entiendo correctamente, S3 te permite crear URLs web para cualquiera de los archivos en tu cubo. Entonces, si, digamos, estas son descargas pagadas, entonces podría have S3 generate a temporary URL for that download y luego eliminar eso una vez que el usuario lo haya descargado.
Si eso no es una opción, puede probar estas clases PHP:
- HTTP protocol client - Una clase que implementa las solicitudes HTTP a los recursos (utilizado por la envoltura de secuencia más adelante). Permite que las solicitudes se transmitan.
- gHttp - Una envoltura de flujos HTTP que permite tratar los recursos HTTP remotos como archivos, utilizando funciones como
fopen()
, fread()
, etc.
- Amazon S3 Stream Wrapper - Una corriente de Amazon S3 envoltorio por el mismo promotor como gHttp. También permite el acceso a recursos remotos como archivos normales a través del
fopen('s3://...')
.
Editar:
This page tiene la información sobre la forma de "preautenticar" una solicitud mediante la codificación de la clave de autenticación en la URL. Se encuentra en la sección titulada: Autenticación de solicitud de cadena de consulta alternativa.
// 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 esquema de encriptación unidireccional (sha1), por lo que no hay riesgo de que se descubra su clave de acceso secreta de AWS.
La única preocupación que tendría con la redirección es que necesita verificar que su seguridad no se transfiere. Si la redirección requiere autorización, se la está dando al cliente. – Joe
Bueno, es por eso que se genera una URL pública temporal. De esta forma, no se pasa información de autenticación, y la URL desaparece una vez que el usuario ha recibido el archivo (o después de un cierto límite de tiempo). – Calvin
No creo que esto solucione mi riesgo de cambio de nombre. Si muevo dos archivos a una carpeta pública para permitir la descarga directamente, tendría que darles nombres amistosos allí. Es posible que tengan el mismo nombre, y luego estoy atascado. – Corey