Cómo utilizar Amazon S3 y PHP para almacenar y administrar archivos de forma dinámica con facilidad

Hace un par de semanas, Nettuts + publicó un tutorial introductorio sobre el uso del Sistema de almacenamiento simple (S3) de Amazon. Poder cargar un número ilimitado de archivos por casi cualquier dinero es genial, pero sería aún mejor si los usuarios pudieran cargar archivos desde su sitio web. De esa manera, no tendría que preocuparse por el tamaño de su servidor web por un segundo. Intentemos!

Básicamente, lo que vamos a hacer es usar un elemento de archivo HTML estándar y una clase S3 PHP fácil de usar para crear una página donde las personas puedan cargar un archivo en su cuenta S3 y obtener información sobre los archivos que ya se han cargado. Para ello, necesitará una cuenta de Amazon S3 y un servidor web habilitado para PHP. Si no ha oído hablar de Amazon S3, o aún no tiene una cuenta, lea primero el tutorial introductorio de Collis S3.

Paso 1

Ahora, lo primero que necesitaremos es una forma en que PHP pueda comunicarse con el servidor S3. Donovan Schonknecht ha escrito una clase de PHP para esto, así que en lugar de intentar reinventar la rueda, usaremos esa!

  1. Descargue la 'última versión beta (0.2.3)'
  2. Extraiga el archivo .rar y copie el archivo S3.php en una nueva carpeta. El archivo viene con un archivo Léame y algunos ejemplos también, pero no los usaremos.
  3. ¡Abra el archivo S3.php y eche un vistazo para ver todo el trabajo que no hará usted mismo gracias a esta clase! :-)

Paso 2

A continuación, cree un nuevo archivo llamado page.php en la misma carpeta. Lo primero que tendremos que hacer es incluir el archivo S3.php. Usaremos la función require_once () en php. Esta función incluirá el archivo solo si no se incluyó anteriormente en la misma página. Esto es para asegurarnos de que no tendremos ningún problema con las redefiniciones de funciones cuando, accidentalmente, el script intente incluir el archivo por segunda vez..

A continuación, tendremos que ingresar la información de acceso a los servicios web de Amazon (AWS) que el script necesita para acceder a nuestro servidor S3. Estas son la clave de acceso y la clave secreta que proporciona Amazon (una vez más, si no sabe de qué estoy hablando, consulte el tutorial introductorio de NETTUTS). Ahora tenemos toda la información necesaria para iniciar la clase. Este código fue puesto en la parte superior de la cuerpo etiquetas.

 

Paso 3

Ahora hagamos un formulario html simple con un elemento de archivo en él. Este elemento permite a los usuarios explorar su disco local en busca de un archivo. Cuando el usuario presiona el botón enviar, el archivo se cargará automáticamente como un archivo temporal al servidor y la información sobre el archivo se enviará en la variable POST.

Aquí está el fragmento de código. Asegúrate de no olvidar enctype = "multipart / form-data" que es necesario para que el elemento de archivo funcione. Este código debe ser colocado fuera de la etiquetas, ya que es HTML.

 

Etapa 4

Ahora, para aquellos desfavorecidos con formas., acción = "" le dice al script a qué página ir después de enviar. Ya que especificamos una cadena vacía allí, el formulario publicará las variables y luego actualizará la página actual. Por lo tanto, cuando se cargue la página, desearemos comprobar si se envió un formulario o no. Cuando se envió un formulario, la página debe ejecutar el script que recupera las variables de publicación y se encarga de mover los archivos al servidor S3..

La variable de publicación enviada por el elemento de archivo es una matriz que contiene información sobre el archivo. Por ejemplo: nombre de archivo, tamaño, tipo y nombre temporal. Todo lo que necesitamos es el nombre de archivo y el nombre temporal. Tenga en cuenta que, a diferencia de otros elementos del formulario, el elemento de archivo enviará las variables a $ _FILES y no a $ _POST.

El siguiente código PHP verifica si se envió un formulario y recupera las variables de publicación. Nos ocuparemos del servidor S3 más tarde. Este código debe colocarse justo después de iniciar la clase s3..

 // verifique si se envió un formulario si (isset ($ _ POST ['Enviar'])) // retreive post variables $ fileName = $ _FILES ['theFile'] ['name']; $ fileTempName = $ _FILES ['theFile'] ['tmp_name']; // ¡Continuaremos nuestro script desde aquí en el siguiente paso! 

Paso 5

Ok, ahora tenemos un formulario que envía un archivo temporal al servidor y te deja algo de información. Si lo desea, puede cargar el archivo en un servidor y probarlo. Notará que, de hecho, lleva algún tiempo procesar el formulario, ya que en realidad está cargando un archivo. De todos modos, no verá aparecer el archivo en ningún lugar de su servidor porque solo se almacenó como un archivo temporal. Todo lo que queda por hacer es mover nuestro archivo cargado a un cubo. Primero crearemos un nuevo contenedor y luego moveremos el archivo a ese contenedor.

Para crear un cubo utilizaremos la función. putBucket (bucket, acl) donde "cubo" es el nombre del cubo (la palabra de Amazon para su carpeta principal o directorio de archivos). El segundo argumento es la Lista de control de acceso (ACL) en la que puede definir quién puede y quién no puede leer o escribir en este grupo. Queremos que cualquiera pueda leer nuestros archivos, así que usaremos S3 :: ACL_PUBLIC_READ. Tenga en cuenta que solo se debe crear un grupo una vez, por lo que cada vez que se ejecute este script, esta función no hará nada, ya que el grupo ya existe..

Para mover el archivo usaremos la función. putObjectFile (archivo de origen, bucket, newfilename, acl).El archivo de origen es la ruta al archivo que queremos mover, por lo que en nuestro caso es el archivo temporal que se cargó a través de nuestro formulario. Bucket es el bucket para mover el archivo, que será el bucket que acabamos de crear. Newfilename es el nombre de archivo que el archivo obtendrá en el cubo. En este tutorial usaremos el mismo nombre de archivo que en la unidad local, pero en algunos casos es posible que desee cambiar los nombres de archivo. Acl nuevamente es la Lista de control de acceso, que nuevamente estableceremos en S3 :: ACL_PUBLIC_READ.

 // crea un nuevo cubo $ s3-> putBucket ("jurgens-nettuts-tutorial", S3 :: ACL_PUBLIC_READ);

// mover el archivo si ($ s3-> putObjectFile ($ fileTempName, "jurgens-nettuts-tutorial", $ fileName, S3 :: ACL_PUBLIC_READ)) echo "Subimos su archivo exitosamente."; else echo "Algo salió mal al cargar tu archivo ... lo siento";

Paso 6

Ahora, cuando selecciona un archivo y presiona "Cargar", el archivo se almacenará en el servidor de Amazon. Ya puede verlo simplemente ingresando una URL que se parece a esto: http: //tu nombre de cubo.s3.amazoneaws.com/tuarchivo.ext

Para el toque final, queremos que la secuencia de comandos genere una lista de archivos en el contenedor. Para ello utilizaremos la función. getBucket (cubo), en qué cubo está el cubo que queremos generar. Esta función devuelve una matriz con información sobre los archivos. Cada uno regresó como una matriz, también. Visualizar:

Queremos generar cada archivo en la matriz $ bucket_contents. Para esto usaremos un para cada() bucle que recorrerá la matriz hasta que todos los elementos hayan sido procesados. Almacenará el elemento actual en la variable $ file y ejecutará el código entre corchetes. Todo lo que tenemos que hacer ahora es repetir un enlace al archivo..

Coloque este código debajo del formulario para mostrar la lista allí..

 getBucket ("jurgens-nettuts-tutorial"); foreach ($ bucket_contents como $ archivo) $ fname = $ archivo ['nombre']; $ furl = "http://jurgens-nettuts-tutorial.s3.amazonaws.com/".$fname; // genera un enlace al archivo echo "$ fname
";?>

Con un poco de estilo css, tu resultado final podría verse así:

Terminado!

Así que ahí lo tienen, su propio script de carga de archivos ilimitado. Por supuesto, hay mucho más que puedes hacer con la clase S3 PHP. Simplemente eche un vistazo rápido a su archivo Léame y estará listo para comenzar. Es realmente fácil de usar!

Descarga los archivos fuente

Ver una demo