Hace cosa de una semana me surgió la necesidad de crear un código para subir imágenes al servidor.
Así que me puse manos a la obra para crear una simple clase a modo de plantilla con la intención de poder hacer variaciones dependiendo de los requisitos de posibles proyectos que así lo pudieran requerir en un futuro.
Aquí os dejo el ejemplo mas abajo las instrucciones, la descargas y el código comentado.
No subas cosas de mal gusto u ofensivas, confió en ti 🙂 , si quieres puedes indicar un alias y una web.
Actualizado 2015 (Se han borrado todos los registros indexados de subidas anteriores, sorry.)
Tamaño máximo de las imágenes 250KB
Descárgate el ejemplo Simple del enlace que hay justo debajo de las instrucciones, descomprime el ZIP y sube la carpeta de su interior con todos sus archivos, excepto el .fla, Leeme.txt, Trim.as, UpImage.as y .htaccess.txt.
Si sabiendo que todo esta correcto continua fallando, podéis probar a subir a la misma carpeta donde se encuentran las carpetas «temporal» e «imágenes» el archivo «.htaccess.txt» y renombrarlo a «.htaccess» verificando que en su interior se encuentran los siguientes comandos:
SecFilterEngine Off
SecFilterScanPOST Off
En el caso de seguir fallando, borrad el htaccess porque de no ser necesario, también puede ser el causante de que no funcione el ejemplo.
Una vez subidos los archivos al servidor, recuerda dar a las carpetas «imágenes» y «temporal» permisos chmod 0777 o mejor si compruebas que funciona con permisos chmod 0755 (por seguridad es mejor)
Al archivo de texto «path.txt» hay que darle permisos chmod 0755 si no probad con chmod 0746 ó 0777
Además de los permisos aseguraros que el archivo está vacío o si no que disponga de una dirección correcta que apunte a una imagen que exista en la carpeta «imágenes».
Tanto la clase .as del ejemplo simple como el .php trabaja con rutas relativas y los métodos y variables son privadas por lo tanto para cambiar rutas u otras cosas, deberéis modificar la clase directamente.
El que quiera puede añadir métodos que permitan configurar opciones de la clase sin tener que estar tocándola internamente en cada proyecto.
Si utilizas la clase en otro proyecto recuerda agregar a la biblioteca los componentes TextArea, Button y ProgressBar.
El script php está basado en un ejemplo de Adobe con algunas correcciones y modificaciones.
Adicionalmente si os descargáis la versión del blog en vez del simple, el del blog utiliza 3 rutas absolutas que deberéis verificar que estén correctas, verificad la ruta que está dentro del archivo UPImage.fla y la clase UPImage.as, modificarlas si es necesario y recompilar el SWF. Dentro del archivo bmpSave.php está la tercera ruta que también tendréis que verificar y cambiar si es necesario.
A fecha de hoy 01/07/2015 e modificado el ejemplo del blog y ahora no borra las imágenes, por lo tanto si os descargáis el ejemplo del blog acordaros que en el archivo php esta comentado el comando unlink encargado de borrar las imágenes.
El trabajo duro esta hecho solo necesita ajustarse al gusto del consumidor, espero que os sirva.
Podéis descargaros el ejemplo simple
[download id=»15″ format=»2″]
o descargaros el ejemplo modificado del blog
[download id=»16″ format=»2″]
Este es el codigo de la clase encargada de subir los archivos al servidor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
/* ▒▒▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░ ▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒ ░░▓▓░░░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░░░▓▓░░ ▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒ ░░▓▓░░░░ ░░░░▓▓░░ ▒▒▓▓░░▓▓ jvm.bricobit.com ▓▓░░▓▓▒▒ ░░▓▓░░░░ Javier Vicente Medina ░░░░▓▓░░ ▒▒▓▓░░▓▓ JVM © 2011 ▓▓░░▓▓▒▒ ░░▓▓░░░░ ░░░░▓▓░░ ▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒ ░░▓▓░░░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░▓▓░░░░▓▓░░ ▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒▓▓▒▒ ░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░▒▒░░ */ package { //Importamos exclusivamente las clases //necesarias // NET import flash.net.FileReference; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.FileFilter; import flash.net.URLVariables; // EVENTS import flash.events.Event; import flash.events.MouseEvent; import flash.events.ProgressEvent; import flash.events.DataEvent; import flash.events.SecurityErrorEvent; import flash.events.HTTPStatusEvent; import flash.events.IOErrorEvent; import flash.errors.IllegalOperationError; // CONTROLS import fl.controls.ProgressBarMode; import fl.controls.ProgressBar; import fl.controls.Button; import fl.controls.TextArea; // DISPLAY import flash.display.Sprite; // CUSTOM import Trim; // Paso 0 Declaramos variables de tipo final public class UpImage extends Sprite {; //--NET private var fileReference:FileReference; private var Request:URLRequest; private var bmpFilters:FileFilter; private var sendVars:URLVariables; //--CONTROLS private var pB:ProgressBar; private var btn:Button; private var txt:TextArea; //--PROPERTIES private var MAX_FILESIZE_UPLOAD:int; private var onUpLoadExec:Function; // Paso 1 Instanciación y configuración final public function UpImage(onUpLoadExecute:Function = null):void { onUpLoadExec = onUpLoadExecute; //--NET fileReference = new FileReference(); //Indicamos la ruta del script php encargado //de guardar el archivo en el servidor Request = new URLRequest("bmpSave.php"); //Configuramos request par enviar //las variables mediante get o post Request.method = URLRequestMethod.POST; //Creamos un filtro con los tipos de //archivos permitidos bmpFilters = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg; *.jpeg; *.gif; *.png"); //Creamos una instancia de URLVariables //que servirá para enviar variables/parámetros //adicionales al script php sendVars = new URLVariables(); //--CONTROLS //Button //No especificamos dimensión ni posición, por //defecto flash coloca el botón en X e Y = 0 //y con anchura 100 y altura 22 btn = new Button(); btn.label = "Subir Imagen"; addChild(btn); btn.addEventListener(MouseEvent.CLICK,openBrowser); //ProgressBar //Lo dejamos en X e y = 0 en primer plano //tapando el botón pB = new ProgressBar(); pB.mode = ProgressBarMode.MANUAL; pB.width = 390; pB.height = 22; addChild(pB); pB.visible = false; pB.value = 0; //TextArea //Colocamos el textarea justo debajo //del progressbar txt = new TextArea(); txt.y = pB.height + 2; txt.width = 390; txt.height = 60; addChild(txt); //--PROPIEDADES //Máximo tamaño permitido para las imágenes //a subir expresado en Kilo-Bytes MAX_FILESIZE_UPLOAD = 50;//en KB 50 } //Paso 2 abrir la pantalla de búsqueda y //selección de ficheros final private function openBrowser(e:Event):void { try { //Abrimos el browser permitiendo ver solo //los archivos con extensión especificados //en bmpFilters fileReference.browse([bmpFilters]); //escuchamos cuando se seleccione un archivo; fileReference.addEventListener(Event.SELECT,onSelectFile); //escuchamos si se cierra o cancela el //Browser sin seleccionar ningún fichero fileReference.addEventListener(Event.CANCEL, removeListenerOfOpenBrowser); } catch (e:IllegalOperationError) { //Se emite en el caso que ya exista un //browser abierto entre otras cosas out(e.message); } } //Paso 3 es llamada si se cierra o cancela el browser //o en el caso del paso 4 si se selecciona un fichero final private function removeListenerOfOpenBrowser(e:Event = null):void { //Removemos listeners de lo contrario daría error //al volver a llamar a openBrowser fileReference.removeEventListener(Event.SELECT,onSelectFile); fileReference.removeEventListener(Event.CANCEL, removeListenerOfOpenBrowser); } //Paso 4 es llamada al seleccionar un fichero desde el browser; final private function onSelectFile(e:Event):void { //borramos los listeners de openBrowser (Paso 3) removeListenerOfOpenBrowser(); var fileName:String = fileReference.name; //recuperamos el tamaño de la imagen en bytes var fileSize:Number = fileReference.size; //Nota para refrescar la memoria //bit: unidad mínima que maneja una computadora. //Se trata de un uno o un cero. //byte: es un conjunto de 8 bits y representa //un caracter. //1 Bit = sistema binario(0 ó 1) //8 Bits = 1 Byte //1024 Bytes = 1 KB (Kilo-Byte) //1024 KB = 1 MB (Mega-Byte) //1024 MB = 1 GB (Giga-Byte) //1024 GB = 1 TB (Tera-Byte) //1024 TB = 1 PB (Peta-Byte) //1024 PB = 1 EB (Exa-Byte) //1024 EB = 1 ZB (Zetta-Byte) //1024 ZB = 1 YB (Yotta-Byte) //1024 YB = 1 YTP (YaTe-Pierdes)(broma) if (fileSize > MAX_FILESIZE_UPLOAD * 1024) { out("No se permiten archivos de más de "+String(MAX_FILESIZE_UPLOAD)+"KB."); } else { //Escuchamos para monitorizar el evento //de progreso de subida fileReference.addEventListener(ProgressEvent.PROGRESS, onFileProgress); //Mostramos el ProgressBar para ver el //progreso y tapamos con él, el botón pB.visible = true; //Escuchamos cuando se complete la transferencia //por parte de flash. Deshabilitado, se usa //UPLOAD_COMPLETE_DATA //fileReference.addEventListener(Event.COMPLETE, onUpLoadComplete); //Escuchamos confirmación del script php al completar //la subida en el servidor correctamente; //(Opcional)Podemos usar Event.COMPLETE o DataEvent.UPLOAD_COMPLETE_DATA //para verificar el final de la subida del fichero //pero es más seguro que confirmemos la subida correcta //nosotros mismos desde el php con UPLOAD_COMPLETE_DATA enviando //un echo "cualquier cadena"; cuando confirmemos la subida fileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,onUpLoadServerComplete); //Escuchamos errores de seguridad en la carga por falta de permisos; fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); //Escuchamos errores en la comunicación por fallo de conexión o fichero inexistente; fileReference.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHttpStatus); //Escuchamos errores indeterminados; fileReference.addEventListener(IOErrorEvent.IO_ERROR, onIoError); //Creamos la variables adicionales que se enviaran mediante post al script php; //podemos enviar por ejemplo un nuevo nombre si quisieramos guardar las imagenes //siempre con un mismo nombre y machacar la anterior o simplemente para guardarla //con un nombre diferente sendVars.FileName_flash = "nuevo_nombre_imagen"; //podemos enviar tantas variables adicionales como necesitemos sendVars.OtraVariable_flash = "Dios mío, dame paciencia... pero damela YAAAA!!"; //Pasamos las variables del objeto sendVars a la instancia Request Request.data = sendVars; //Subimos y enviamos el archivo al script php; fileReference.upload(Request); //Nota: Otra manera de enviar variables adicionales sin utilizar URLVariables sería; //Request = new URLRequest("http://www.midominio.com/mi_script.php?fileName="+fileName); //fileReference.upload(Request); out("Subiendo el fichero " + fileName + ", espere.."); } } //Paso 5 mientras se sube mostramos el progreso en un progressBar final private function onFileProgress(e: ProgressEvent):void { //Nota: Si disponemos de una conexión buena y la imagen es pequeña es posible que no apreciemos //el avance del progrssBar dando la sensación que no funciona. Para probar que funciona y apreciar //el progreso de carga hay que subir imágenes de un tamaño superior a 300KB aprox pB.setProgress(e.bytesLoaded,e.bytesTotal); } //Paso ? al completarse la subida del archivo por parte de flash //private function onUpLoadComplete(event:Event):void { //No lo utilizo, utilizamos el evento de confirmación del servidor UPLOAD_COMPLETE_DATA //} //Paso 6 recibimos respuesta del script php conforme se ha completado la subida en el servidor //preparamos la clase para poder volver a subir un archivo (Paso 2) final private function onUpLoadServerComplete(e:DataEvent):void { //Si el archivo se guardo correctamente lanzamos un echo desde php //echo "correct@@"; //Si no se guardo //Echo "error@@"; //Y recuperamos los datos enviados desde el servidor //Nota: Es posible que pueda ocurrir un error no controlado por parte del //script php, concretamente del código encargado de eliminar los archivos de //imagen antiguos. //Si ocurre esto el mensaje puede venir concatenado junto con un error de PHP de nivel E_WARNING y estropearnos //la sentencia de comparación, para solucionarlo enviamos los mensajes de error con un separador @@ //desde php y desde flash convertimos el mensaje en un array para poder comparar el resultado correctamente var input:Array = new Array(); input = e.data.split("@@");// ó input = e.text.split("@@"); var msg:String = Trim.Var(input[0]); var warning:String = Trim.Var(input[1]); if (msg == "RenameCorrect") { out("Subida del archivo " + fileReference.name+ " completada"); if (onUpLoadExec != null) { onUpLoadExec("imagenes/" + fileReference.name); } } else if (msg == "RenameError") { out("Error de servidor: El servidor no pudo Renombrar la ruta, intente subir de nuevo la imagen."); } else if (msg == "TemporalError") { out("Error de servidor: No se pudo mover el archivo a la carpeta Temporal, intente subir de nuevo la imagen."); } if (warning != "") { out("Error de servidor: E_WARNING"); out(warning); } removeListeners(); } //ERRORES AVISOS Y CONFIRMACIONES //Si se produce un error de seguridad al cargar el archivo por culpa de falta de permisos final private function onSecurityError(event:SecurityErrorEvent):void { removeListeners(); out("Error de seguridad: No ha sido posible subir el archivo"); } //Si se produce un error en la comunicación o conexión con el fichero final private function onHttpStatus(event:HTTPStatusEvent):void { removeListeners(); out("Error de conexion, no se encuentra el archivo: No ha sido posible subir el archivo. Descripción: " + event.status); } //Si se produce un error indeterminado en la subida final private function onIoError(event:IOErrorEvent):void { removeListeners(); out("Error: No ha sido posible subir el archivo. Descripción: " + event.text); } final private function removeListeners():void { //quitamos el listener PROGRESS fileReference.removeEventListener(ProgressEvent.PROGRESS, onFileProgress); //quitamos el listener COMPLETE; //fileReference.removeEventListener(Event.COMPLETE, onUpLoadComplete); //quitamos el listener UPLOAD_COMPLETE_DATA fileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,onUpLoadServerComplete); //quitamos el listener security SECURITY_ERROR; fileReference.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); //quitamos el listener HTTP_STATUS; fileReference.removeEventListener(HTTPStatusEvent.HTTP_STATUS, onHttpStatus); //quitamos el listener IO_ERROR; fileReference.addEventListener(IOErrorEvent.IO_ERROR, onIoError); //escondemos el ProgressBar y el boton volvera a ser visible; pB.visible = false; } //-------------------------------------------------------------------------------------------------- //Mensaje de salida final private function out(buffer:String):void { txt.htmlText += buffer + "\n"; txt.verticalScrollPosition = txt.maxVerticalScrollPosition; } final public function destroy():void { //--NET fileReference = null; Request = null; bmpFilters = null; sendVars = null; //--CONTROLS btn.removeEventListener(MouseEvent.CLICK,openBrowser); removeChild(pB); pB = null; removeChild(btn); btn = null; removeChild(txt); txt = null; //AutoKill (hara-kiri) :P parent.removeChild(this); } }//End Class }//End Package |
Uso de la clase en el Stage
1 2 3 4 5 6 7 8 9 10 11 12 |
import UpImage; var upImage:UpImage = new UpImage(); addChild(upImage); //Al instanciar la clase podemos opcionalmente pasarle una funcion como parametro que //se ejecutara y recibira un string de la ruta de la ultima imagen subida al guardarse //en el servidor. //var upImage:UpImage = new UpImage(loadImage); //addChild(upImage); //function loadImage(path:String):void{ //trace("La direccion de la ultima imagen subida es "+ path); //} |
Aquí tenéis el código PHP encargado de subir los archivos y de borrar los más antiguos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
/* El tamaño máximo de la imagen ya lo delimitamos desde flash a 50KB pero desde php es recomendable delimitarlo también a 50KB para impedir que mediante inyección nos metan un archivo de gran tamaño Tamaño máximo de la imagen expresado en bytes (1024 * 50 = 51200 bytes, 51200 bytes = 50 KB) */ $MAXIMUM_FILESIZE = 1024 * 50; /* Recuperamos las variables o parámetros adicionales enviados desde flash utilizando para ello $POST['NombreVariable'] Recuperamos la referencia del archivo pasado con filereference utilizando para ello $_FILES['Filedata'] Para el caso que quisiéramos darle otro nombre al guardarlo recuperamos el nuevo nombre desde flash $fileName_php = $_POST['FileName_flash']; Otra variable de muestra $otraVariable_php = $_POST['otraVariable_flash']; Comprobamos que el tamaño de la imagen no exceda el máximo permitido indicado */ if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) { // FILESIZE CHECK (1) -------------- /* Pasamos el nombre del archivo decodificado en utf8 a una variable para evitar problemas con los acentos y movemos el archivo a una carpeta temporal para poder trabajar con ella */ $FileUpLoaded = utf8_decode($_FILES['Filedata']['name']); if( ! move_uploaded_file($_FILES['Filedata']['tmp_name'], "temporal/".$_FILES['Filedata']['name'])){ //MOVE FILE TEMP (2) -------------- /* Si no se pudo mover el archivo a la carpeta temporal mandamos un error a flash */ echo "TemporalError@@"; }else{ /* Si se pudo mover.. Comprobamos la imagen con exif_imagetype para saber si es un tipo de imagen correcto y el tipo de imagen mediante el valor devuelto */ $type = exif_imagetype("temporal/".$_FILES['Filedata']['name']); /* Esta es la tabla de los diferentes resultados que podemos comprobar Valor constante ----- ------------ 1 IMAGETYPE_GIF 2 IMAGETYPE_JPEG 3 IMAGETYPE_PNG 4 IMAGETYPE_SWF 5 IMAGETYPE_PSD 6 IMAGETYPE_BMP 7 IMAGETYPE_TIFF_II (orden de byte intel) 8 IMAGETYPE_TIFF_MM (orden de byte motorola) 9 IMAGETYPE_JPC 10 IMAGETYPE_JP2 11 IMAGETYPE_JPX 12 IMAGETYPE_JB2 13 IMAGETYPE_SWC 14 IMAGETYPE_IFF 15 IMAGETYPE_WBMP 16 IMAGETYPE_XBM 17 IMAGETYPE_ICO Podemos comparar el tipo mediante el valor o mediante la constante Ej: if (exif_imagetype('imagen.gif') != IMAGETYPE_GIF) { echo 'La imagen no es gif'; } Si el valor devuelto es gif, jpg o png */ if ($type == 1 || $type == 2 || $type == 3) { /* Entonces movemos el archivo de la carpeta temporal a su destino final "./imagenes/" */ if(rename("./temporal/".$_FILES['Filedata']['name'], "imagenes/".$_FILES['Filedata']['name'])){ /* Si se movió satisfactoriamente enviamos un mensaje a flash conforme se completo la carga y flash mostrara la última imagen en pantalla */ echo "RenameCorrect@@"; }else{ // De lo contrario le mandamos un error echo "RenameError@@"; } } else { /* Si no es ningún tipo de formato permitido entonces eliminamos el archivo de la carpeta temporal, el caso en el que podría ocurrir seria si no especificáramos correctamente los filtros del Browser en flash y el usuario pudiera seleccionar formatos de archivo no permitidos para este script. El otro caso podría ser mediante inyección de código desde fuera de la aplicación flash, por lo que eliminando el archivo evitamos que nos endiñen un archivo malicioso que pueda ejecutarse posteriormente */ unlink("temporal/".$_FILES['Filedata']['name']); } /* SEGUNDA PARTE DEL SCRIPT SCRIPT ENCARGADO DE BORRAR LOS ARCHIVOS MAS VIEJOS CUANDO EL NUMERO DE ARCHIVOS DEL DIRECTORIO EXCEDE EL MAXIMO PERMITIDO Metodología: Imaginemos que la carpeta donde guardamos la imágenes esta bacía y subimos la imagen img1.jpg, supongamos también que el límite de imágenes es 2 img1.jpg Al subir la imagen 1 el script no hace nada porque no excede el limite img2.jpg Al subir la imagen 2 el script sigue sin hacer nada porque no excede el limite img3.jpg Al subir la imagen 3 el script comprueba que excede el límite y compara que fichero es el más antiguo y lo borra quedando en el servidor los siguiente archivos img2.jpg img3.jpg Nota: Si subimos una imagen ya existente simplemente la machaca Comenzamos.. Creamos un array para guardar una referencia de todos los archivos del directorio */ $files = array(); /* Indicamos el maximo de imagenes que queremos que se puedan guardar */ $MAXIMUM_FILE_COUNT = 2; /* Seguidamente abrimos el directorio donde se encuentran las imagenes */ if ($directory = opendir('./imagenes/')) { //OPEN DIR (3) --------------------------------------------- /* Recorremos todos los archivos del directorio y almacenamos una referencia en el array $files de cada archivo. Esta es la forma correcta de iterar sobre el directorio según el manual de php, el ejemplo de Adobe no era del todo correcto */ while (false !== ($file = readdir($directory))) { /* Almacenamos en el array un nuevo array de 2 elementos por cada fichero, en el primer elemento del segundo array almacenamos la referencia del fichero y en el segundo elemento almacenamos la fecha/último momento en el que fue modificado el fichero, utilizando filectime. filectime devuelve la fecha de la ultima modificación del fichero pasado por parámetro En esta parte ocurría un error que adobe no ha tenido en cuenta al hacer el ejemplo, antes de agregar la referencia del archivo al array $files tenemos que saber que readdir devuelve como primer resultado un "." después devuelve el nombre de los archivos succesivamente y finaliza enviando un último resultado ".." Agregamos al array los nombres de archivo solo si no son igual a "." ó ".." Si no, evitamos agregar los 2 resultados al array el método unlink nos dará error y además provocará que la sentencia "if (count($files) > $MAXIMUM_FILE_COUNT) {" se cumpla erróneamente */ if ($file != "." && $file != "..") { array_push($files, array('imagenes/'.$file, filectime('imagenes/'.$file))); } }//End while // Ordenamos el array para que los más viejos aparezcan en las primeras posiciones del array usort($files, ordenar); // Si el total de archivos del directorio es superior al máximo permitido if (count($files) > $MAXIMUM_FILE_COUNT) { /* Eliminamos del array $files el numero de archivos sobrantes restando el máximo de archivos permitidos menos el total de archivos existentes y utilizando array_splice desde el primer elemento del array en adelante, array_splice nos devuelve un nuevo array con los elementos eliminados */ $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); // Recorremos los archivos más antiguos sobrantes for ($i = 0; $i < count($files_to_delete); $i++) { // Los borramos unlink($files_to_delete[$i][0]); } } //Cerramos el directorio closedir($directory); }//END IF OPEN DIR (3) }//END ELSE IF MOVE FILE TEMP (2) } //END IF FILESIZE CHECK (1) //------------------------------------------------------------------ function ordenar($a, $b) { //si la ultima fecha de a y de b son iguales devolvemos a usort 0 //si son iguales el elemento no se mueve if ($a[1] == $b[1]) { return 0; } else { //si la fecha de a es menor que la de b devolvemos -1 //usort ordena b por encima de a dentro del array //si la fecha de a es mayor que la de b devolvemos 1 //usort ordena a por encima de b dentro del array return ($a[1] < $b[1]) ? -1 : 1; } } //----------------------------------------------------------------- /* Parte encargada de guardar en un archivo de texto la ruta de la última imagen subida para poder recuperarla desde flash. Abrimos el archivo */ $fp = fopen("path.txt", 'w+'); // Escribimos en el fwrite($fp, "imagenes/".$_FILES['Filedata']['name']); // Cerramos el fichero fclose($fp); |
One comment on “AS3 – Útiles – Subir imagenes o archivos al servidor con filereference.upload con php y flash”
Muy bueno el ejemplo, mis felicitaciones por el blog.