ActionScript 3.0: Subir archivos con FileReference y PHP
La clase File Reference de AS3 es bastante parecida a la de AS2. Además el ejemplo de la ayuda de Flash es bastante sencillo de entender.El código que pongo a continuación esta hecho a partir de dicho ejemplo, al que he añadido algunos comentarios para explicarlo. Para utilizarlo Hay que tener en el escenario un boton llamado «Examinar_bt» y un campo de texto dinámico llamado «Estado_txt».
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 |
//Clases necesarias import flash.events.*; import flash.net.FileFilter; import flash.net.FileReference; import flash.net.URLRequest; //Dirección del PHP que va a subir el archivo var uploadURL:URLRequest; var archivo:FileReference; //Función llamada al pulsar examinar, se crea el filereference y se abre el navegador de archivos function Examinar(event:MouseEvent) { Estado_txt.appendText("n" + "Vamos a seleccionar el archivo."); uploadURL = new URLRequest(); uploadURL.url = "uploadFile.php"; archivo = new FileReference(); PonerListeners(archivo); archivo.browse(getTypes()); } //Añado los listener al objeto filereference function PonerListeners(dispatcher:IEventDispatcher) { dispatcher.addEventListener(Event.CANCEL, cancelHandler); dispatcher.addEventListener(Event.COMPLETE, completeHandler); dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); dispatcher.addEventListener(Event.OPEN, openHandler); dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); dispatcher.addEventListener(Event.SELECT, selectHandler); dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,uploadCompleteDataHandler); } //Con está función se generan los tipos de archivos que estarán disponibles para seleccionar desde el navegador function getTypes():Array { var allTypes:Array = new Array(getImageTypeFilter(), getTextTypeFilter()); return allTypes; } //Tipos de imágenes admitidos, tanto para pc como para mac function getImageTypeFilter():FileFilter { return new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png"); } //Tipos de archivos de texto admitidos, para pc y mac function getTextTypeFilter():FileFilter { return new FileFilter("Text Files (*.txt, *.rtf)","*.txt;*.rtf"); } //Se distribuye cuando se cancela la descarga desde el navegador de archivos. function cancelHandler(event:Event):void { Estado_txt.appendText("n" + "Subida cancelada."); } //Se distribuye cuando se finaliza la descarga o la carga function completeHandler(event:Event):void { Estado_txt.appendText("n" + "Subida completada."); } //Se reciben datos del servidor tras completar la carga function uploadCompleteDataHandler(event:Event):void { Estado_txt.appendText("n" + "Subida confirmada por el servidor."); } //Se produce cuando falla la carga y hay un código http de error. //Por ejemplo si no se encuentra el PHP, se generará un error 404. function httpStatusHandler(event:HTTPStatusEvent):void { Estado_txt.appendText("n" + "Se ha producido el siguiente error: " + event.status); } //Se produce cuando falla la carga o descarga function ioErrorHandler(event:IOErrorEvent):void { Estado_txt.appendText("n" + event.text); } //Se inicia la carga o descarga function openHandler(event:Event):void { Estado_txt.appendText("nComienza la subida"); } //Se distribuye periodicamente durante la carga o la descarga, mostrando el progreso de la misma. function progressHandler(event:ProgressEvent):void { var file:FileReference = FileReference(event.target); Estado_txt.appendText("n" + event.bytesLoaded + " bytes de " + event.bytesTotal + " bytes subidos."); } //Se distribuye al intentar descargar o cargar un archivo de un servidor fuera del entorno de seguridad de la película function securityErrorHandler(event:SecurityErrorEvent):void { Estado_txt.appendText("nEl servidor no permitió la carga del archivo."); } //Se distribuye al elegir el archivo para carga o descarga desde el navegador de archivos. function selectHandler(event:Event):void { Estado_txt.text = ""; var archivo:FileReference = FileReference(event.target); Estado_txt.appendText("n" + "Archivo elegido: " + archivo.name + "n" + "Tamaño = " + archivo.size + " bytes."); if(archivo.size > 20000){ Estado_txt.appendText("nNo se pueden subir archivos de más de 20 KB."); }else{ archivo.upload(uploadURL); } } Examinar_bt.addEventListener(MouseEvent.CLICK,Examinar); |
Y los archivos fuente:
Descargar fuentes
COMENTARIOS
Muy bueno y claro el articulo. Utilice el script en un formulario que estoy haciendo en Flash, funciona bien el AS, pero cuando carga el archivo me da el siguiente error:
«Se ha producido el siguiente error: 404 – Error #2038»
Sospecho que el problema esta en los paths, tanto del que define el directorio de carga en el php, como el que esta en el AS y busca al php.
El path que define el directorio en el php, ¿es relativo al php mismo o al html donde esta el flash? Yo lo puse relativo al php.
Lo mismo con el AS, el path al php, ¿es relativo al html donde esta embebido el swf?
Al directorio que cree para subir los archivos les di todos los permisos como para no errarle.
Gracias por la dedicacion!
Ya solucione lo del path, ahora funciona perfectamente, habia puesto mal el path al php del AS, era relativo al swf como debia estar.
Una inquietud, hay alguna forma de que el scroll de Estado_txt (… bueno me olvidaba, en vez de usar un texto dinamico utilice un textarea), permanezca siempre abajo, es decir, alguna manera de forzarlo a que siempre muestre la ultima linea. Sucede que cuando va cargando el archivo, los textos que va mostrando salen del cuadro y se quedan abajo, entonces hay que mover la barra de scroll para verlos.
Por lo pronto muchas gracias, me fue de suma utilidad el articulo.
Hola Jovix
Lo suyo es que hagas una función «ponerTexto» en la que centralices los mensajes, y en esa función hacer los apaños necesarios para que el texto se mueva como quieras.
A mi me funciono pero hay dos cosas que me dar problema, 1 como hago para ver la foto subida en un fl.conteiner ILoader hay imagenes que tiene carateres esoerciales como niño.jpg que dan error como hago para reparar?
la imagen me aparece asi cajaimg.source=»caras/»+archivo.name; pero no siempre fuciona GRacias por tu ayuda!
@Make Pixels
La imagen se sube bien aunque tenga caracteres especiales, el «problema» viene luego. Yo te recomiendo que al subir la imagen la renombres en php y luego devuelvas el nueva nombre o id al flash.
Hola, estoy haciendo un ejemplo similar solo que quiero almacenar una imagen a mysql via php, he encontrado ejemplos en php donde lo hacen tomando el path del archivo seleccionado y quisiera saber si se podria usando flash, ojala me puedan ayudar o facilitar algun tutorial.
De antemano gracias a todos
Hola a todos.. estoy utilizando este codigo, pero tengo varios problemas que no se como resolverlos. Haber si alguien me ayuda..
1. Necesito pasar desde AS el nombre por el cual voy a remplazar la imagen. por ejemplo si la imagen se llama abc y desde AS mando hola, como recibo hola en php para poder reemplazar por abc.
2. Como devuelvo el nuevo nombre a AS como esedeerre sugiere en el ultimo comment.
Mira Renata una solución a lo que quieres hacer es guardar el path de la imagen en el directorio donde has subido la imagen en una base de datos (puede ser mysql), así como el nombre y algún otro dato que desees de la imagen, y luego para visualizar solo tienes que hacer una consulta a la base de datos con el path guardado y con eso basta…espero que te sirva el comentario.
MUCHAS GRACIAS POR EL CODIGO… me iluminaste el dia
ahora la pregunta del millon es como hago para mostrar la imagen cargada dentro de un movie… la idea es poder hacer qe el usuario personalize una postal y pueda subr su foto y que luego la podra ver en el movie junto a un mensaje
te agradesco de antemano por tu ayuda!!
hola mm soy nueva en esto y cree una web en flash cs4 as3, quiero agregar un boton o un enlace para que los que visiten la pagina puedan descargar documentos en word, pdf o en ppt, cheque un codigo que tenian aqui, pero me aparece packeges cannot be nested, y copie el codigo directo de aqui. necesito ayuda porfas, estoy bien verde en esto.les agradeceria mucho su ayuda
este es el codigo que use,
package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.FileReference;
import flash.net.URLRequest;
import flash.net.FileFilter;
public class FileReference_download extends Sprite {
private var downloadURL:URLRequest;
private var fileName:String=»Tiempo_de_Renovacion.pps»;
private var file:FileReference;
public function FileReference_download() {
downloadURL = new URLRequest();
downloadURL.url=»http://www.[parroquiasanjoseapo].com/Tiempo_de_Renovacion.pps»;
file = new FileReference();
configureListeners(file);
file.download(downloadURL, fileName);
}
}
}
descarga_btn.addEventListener(MouseEvent.CLICK,descarga);
no pusiste el codigo php
Excelente, muchisimas gracias!!!
Hola gente, necesito a quien pueda ayudar porque me meti a hacer algo que ahora se me esta re complicando, el codigo que esta publicado es excelente (gracias!!!!) y ya me resolvio una parte de lo que tenia que hacer, pero ahora no encuentro la manera de hacer visible la imagen porque se me carga sola una vez que la tengo en el servidor, pido que me ayuden si pueden cualquier comentario me sera util.
Necesito que la imagen me aparezca cuando termine de cargar para que el usuario la pueda modificar y poner en un area determinada. Gracias a todos, saludos
Saludos
Oigan, esto es justo lo que busco pero falta la parte donde muestren la imagen que subimos
no se si puedan ayudarme
y si me explicaran todaviade una ofrma mas lenta pq no entiendo muy bien lo de los import gracias
muchas gracias por tu valioso aporte.. me ha sido de gran utilidad .. funciona de pelos!!
Salud en hora buena!
Hola que tal, tengo un gran problema con esta aplicación, es que al usarla ya en un servidor el archivo que subo no aparece en el directorio que uso!! no se que está pasando. En el código php dice que se sube a una carpeta llamada «subidas/», yo lo cambié por una que se llama «curriculums/» pero subo archivos desde la página y me meto al servidor y la carpeta está vacia, no se por que, si alguien me pudiera ayudar le agradecería mucho, saludos a todos!!
Hola que tal, tengo un gran problema con esta aplicación, es que al usarla ya en un servidor el archivo que subo no aparece en el directorio que uso!! no se que está pasando. En el código php dice que se sube a una carpeta llamada «subidas/», yo lo cambié por una que se llama «curriculums/» pero subo archivos desde la página y me meto al servidor y la carpeta está vacia, no se por que, si alguien me pudiera ayudar le agradecería mucho, saludos a todos!!
Hola chicos, soy muy nuevo en esto y de antemano quiero agradecer por el aporte de este tutorial. sinembargo tengo algunas dudas. pues quiero meter todo ese codigo en un .as para ser usado como una clase, pero cuando lo importo en el fla no pasa nada. alguna idea de como puedo convertir bien eso a una clase y usarla para cualquier poryecto importandola desde el fla?
gracias.
Hola.. oye me sale el mismo error de Jovix, pero no supe arreglar eso de los paths. ¿me podrían ayudar porfavor?
Gracias!!
luego de subirlos que? eso aparece en el mail? o como es el asunto!
gracias
DEJA TU COMENTARIO