que - install aws php
Obligando a la descarga de los servidores s3 amazon (5)
La pregunta es acerca de cómo configurar esto mediante programación, pero para hacerlo manualmente a través de la consola de AWS:
- Seleccione un archivo en S3.
- Propiedades> Metadatos> Añadir más metadatos
- Clave: Contenido-Disposición Valor: Adjunto
- Salvar
He estado desarrollando una nueva aplicación web que se basa en los servidores de Amazon S3 como sistema de almacenamiento y en Codeiginter como el marco PHP.
Necesito forzar el archivo para descargar cuando se hace clic en el enlace. La URL original se ve así:
http://www.our-web.com/download/do/1.jpg
que genera una URL firmada temporalmente para el archivo real en los servidores de Amazon S3 como este:
http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D
Necesito hacer que el archivo comience a descargarse desde la URL real de Amazon, tan pronto como el usuario haga clic en el enlace.
Ahora tengo dos maneras de hacerlo:
- Use
redirect()
que abrirá el archivo, no lo descargará; o Alterar encabezados como este código:
header(''Content-type: application/force-download''); header(''Content-Disposition: attachment; filename='' . $file_name); header(''Content-Transfer-Encoding: binary''); header(''Expires: 4000''); header(''Cache-Control: must-revalidate, post-check=0, pre-check=0''); header(''Pragma: public''); header(''Content-Length: '' . filesize($generated_file)); readfile($generated_file);
Desafortunadamente, ambas formas no me ayudan. El segundo método hace que la descarga provenga de mi sitio web y no directamente de Amazon.
¿Cómo puedo forzar que el archivo se descargue directamente desde los servidores de Amazon S3 y no desde mi sitio web?
No puedes decirle al navegador cómo manejar un archivo remoto. Al redirigir a Amazon, le está diciendo al navegador que inicie una nueva solicitud allí. Usted no tiene ningún control sobre esa solicitud.
La única solución que se me ocurre es empaquetar la imagen en un archivo zip o similar. Por supuesto que agrega otra forma de complejidad (probablemente molesta).
Poco tarde en la fiesta, pero a menudo con un archivo no quieres tener que decidir en el momento del almacenamiento cómo se usará. Desea poder almacenar el archivo una vez, luego en un área posiblemente incruste el archivo o la pantalla en el navegador, y en otra área permita al usuario descargar el mismo archivo.
Afortunadamente, puede hacerlo proporcionando parámetros de anulación en la url de solicitud. Solo funciona con solicitudes firmadas, pero afortunadamente ya lo estás haciendo.
Si agrega un parámetro como &request-content-type="application/force-download"
debería hacer el truco.
Consulte la sección Parámetros de solicitud de la documentación de S3 GET Object: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
Si su sitio web de S3 está detrás de CloudFront, ¡no olvide invalidar el archivo antes de volver a intentarlo! Eso borrará el archivo en caché.
Puede acceder a la página de invalidación yendo a:
Cloudfront -> Distribution Settings -> Invalidation
Luego ingrese la ruta al archivo.
Tomará algún tiempo para invalidar el archivo. Para mi archivo tardó 5 minutos.
Solo necesita configurar los encabezados correctos en sus archivos en S3 para forzar al navegador a descargar en lugar de abrir el archivo. Establece estos:
Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream
Deberá configurarlos cuando cargue los archivos a S3. Con el php SDK utilizarías create_object
.
O puede configurarlos después de cargarlos usando ''change_content_type'' o copiando el archivo a sí mismo en S3 y configurando los encabezados correctos.