Uso de la clase FileReference

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Un objeto FileReference representa un archivo de datos en un equipo cliente o servidor. Los métodos de la clase FileReference permiten que la aplicación cargue y guarde archivos localmente, y que pueda transferir datos de archivo en servidores remotos.

La clase FileReference proporciona dos enfoques distintos para cargar, transferir y guardar archivos de datos. Desde su introducción, la clase FileReference ha incluido los métodos browse() , upload() y download() . Utilice el método browse() para permitir que el usuario seleccione un archivo. Use el método upload() para transferir los datos de archivo a un servidor remoto. Emplee el método download() para recuperar esos datos del servidor y guardarlos en un archivo local. Al comenzar con Flash Player 10 y Adobe AIR 1.5, la clase FileReference incluye los métodos load() y save() . Asimismo, los métodos load() y save() permiten acceder y almacenar archivos locales directamente. El uso de dichos métodos es similar a los métodos del mismo nombre incluidos en las clases URLLoader y Loader.

Nota: la clase File, que amplía la clase FileReference, junto con la clase FileStream proporcionan funciones adicionales para trabajar con archivos y el sistema de archivos local. Las clases File y FileStream solo se admiten en AIR y no en Flash Player.

Adobe recomienda

Load and Save Local Files (Cargar y guardar archivos locales, en inglés)

Kevin Hoyt
En este vídeo, Kevin Hoyt descubre lo sencillo que es cargar y guardar contenido local con Flash.

Clase FileReference

Cada objeto FileReference representa un único archivo de datos del equipo. Las propiedades de la clase FileReference contienen la siguiente información referente al archivo: tamaño, tipo, nombre, extensión, creador, fecha de creación y fecha de modificación.

Nota: la propiedad creator solo se utiliza en Mac OS. En todas las demás plataformas se devuelve null .
Nota: la propiedad extension solo se admite en Adobe AIR.

Se puede crear una instancia de la clase FileReference de una de estas dos formas:

  • Con el operador new , como se puede ver en el siguiente código:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Llame al método FileReferenceList.browse() , que abre un cuadro de diálogo y solicita al usuario que seleccione uno o varios archivos para cargar. Seguidamente, crea un conjunto de objetos FileReference si el usuario selecciona correctamente uno o varios archivos.

Una vez creado el objeto FileReference, puede realizar lo siguiente:

  • Llamar al método FileReference.browse() , que abre un cuadro de diálogo y solicita al usuario que seleccione un solo archivo del sistema de archivos locales. Esto se suele realizar antes de una llamada posterior al método FileReference.upload() o FileReference.load() . Llame al método FileReference.upload() para cargar el archivo en un servidor remoto. Llame al método FileReference.load() para abrir un archivo local.

  • Llamada al método FileReference.download() . El método download() abre un cuadro de diálogo donde el usuario puede seleccionar una ubicación para guardar el nuevo archivo. Posteriormente, descarga datos del servidor y los guarda en el nuevo archivo.

  • Llamada al método FileReference.load() . Este método comienza a cargar datos desde un archivo seleccionado previamente mediante el método browse() . No es posible llamar al método load() hasta que no finaliza la operación de browse() (el usuario selecciona un archivo).

  • Llamada al método FileReference.save() . Este método abre un cuadro de diálogo y pide al usuario que seleccione una ubicación de archivo única en el sistema de archivos local. Seguidamente, guarda los datos en la ubicación especificada.

Nota: solo se puede realizar una acción browse() , download() o save() a la vez, ya que no se pueden abrir varios cuadros de diálogo de forma simultánea.

Las propiedades del objeto FileReference, como name , size o modificationDate no se definen hasta que se produce una de las situaciones siguientes:

  • Se ha llamado al método FileReference.browse() o FileReferenceList.browse() y el usuario ha seleccionado un archivo desde el cuadro de diálogo.

  • Se ha llamado al método FileReference.download() y el usuario ha especificado una nueva ubicación del archivo desde el cuadro de diálogo.

Nota: cuando se realiza una descarga, solo la propiedad FileReference.name se llena antes de finalizar la descarga. Una vez finalizada la descarga, todas las propiedades están disponibles.

Durante la llamada a los métodos FileReference.browse() , FileReferenceList.browse() , FileReference.download() , FileReference.load() o FileReference.save() , la mayoría de reproductores continúan ejecutando el archivo SWF, incluidas la distribución de eventos y la ejecución del código.

Para las operaciones de carga y descarga, un archivo SWF solo puede acceder a archivos de su propio dominio, incluidos los dominios especificados en un archivo de política. Es preciso colocar un archivo de política en el servidor que contiene el archivo si dicho servidor no se encuentra en el mismo dominio que el archivo SWF que inicia la carga o la descarga.

Consulte FileReference .

Carga de datos desde archivos

El método FileReference.load() permite cargar datos en la memoria local desde un archivo local.

Nota: el código debe llamar primero al método FileReference.browse() para que el usuario pueda seleccionar un archivo para cargarlo. Esta restricción no se aplica al contenido que se ejecuta en Adobe AIR en el entorno limitado de seguridad de la aplicación.

El método FileReference.load() devuelve un valor inmediatamente después de la llamada, pero los datos que se cargan no están disponibles hasta un tiempo después. El objeto FileReference distribuye eventos para invocar métodos de detectores en cada paso del proceso de carga.

El objeto FileReference distribuye los siguientes eventos durante el proceso de carga.

  • Evento open ( Event.OPEN ): se distribuye cuando se inicia la operación de carga.

  • Evento progress ( ProgressEvent.PROGRESS ): se distribuye periódicamente a medida que se leen bytes de datos del archivo.

  • Evento complete ( Event.COMPLETE ): se distribuye cuando la operación de carga finaliza correctamente.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): se distribuye si falla el proceso de carga debido a un error de entrada/salida durante la apertura o la lectura de los datos en el archivo.

Cuando el objeto FileReference distribuye el evento complete, es posible acceder a los datos cargados como un elemento ByteArray en la propiedad data del objeto FileReference.

El siguiente ejemplo muestra cómo solicitar al usuario que seleccione un archivo y cargue en la memoria los datos de dicho archivo:

package 
{ 
     import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample1 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample1() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            trace(fileRef.data); 
        } 
 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

El código de ejemplo primero crea el objeto FileReference llamado fileRef y, a continuación, llama a su método browse() . El método browse() abre un cuadro de diálogo que solicita al usuario que seleccione un archivo. Cuando un archivo está seleccionado, el código invoca al método onFileSelected() . Este método añade detectores para los eventos progress y complete y, seguidamente, llama al método load() del objeto FileReference. Los otros métodos de controladores del ejemplo simplemente producen mensajes que informan sobre el progreso de la operación de carga. Cuando finaliza la carga, la aplicación muestra el contenido del archivo cargado mediante el método trace() .

En Adobe AIR, la clase FileStream proporciona una funcionalidad adicional para leer datos desde un archivo local. Consulte Lectura y escritura de archivos .

Guardar datos en archivos locales

El método FileReference.save() permite guardar datos en un archivo local. Comienza abriendo un cuadro de diálogo para que el usuario pueda introducir un nuevo nombre de archivo y una ubicación en la que guardarlo. Una vez seleccionado el nombre de archivo y la ubicación, los datos se escriben en el nuevo archivo. Una vez guardado correctamente el archivo, las propiedades del objeto FileReference se llenan con las propiedades del archivo local.

Nota: el código solo debe llamar al método FileReference.save() como respuesta a un evento iniciado por el usuario (por ejemplo, un clic del ratón o la pulsación de una tecla). En caso contrario, se emite un error. Esta restricción no se aplica a contenido que se ejecuta en Adobe AIR en el entorno limitado de seguridad de la aplicación.

El método FileReference.save() devuelve un valor inmediatamente después de recibir la llamada. Seguidamente, el objeto FileReference distribuye eventos para llamar a métodos de detección en cada paso del proceso grabación del archivo.

El objeto FileReference distribuye los siguientes eventos durante el proceso de grabación del archivo:

  • Evento select ( Event.SELECT ): se distribuye cuando el usuario especifica la ubicación y el nombre de archivo del nuevo archivo que se va a guardar.

  • Evento cancel ( Event.CANCEL ): se distribuye cuando el usuario hace clic en el botón Cancelar del cuadro de diálogo.

  • Evento open ( Event.OPEN ): se distribuye cuando se inicia la operación de grabación.

  • Evento progress ( ProgressEvent.PROGRESS ): se distribuye periódicamente a medida que los bytes de datos se guardan en el archivo.

  • Evento complete ( Event.COMPLETE ): se distribuye cuando la operación de grabación finaliza correctamente.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): se distribuye si el proceso de grabación falla debido a un error de entrada/salida al intentar guardar los datos en el archivo.

El tipo de objeto transferido en el parámetro data del método FileReference.save() determina el modo en el que se escriben los datos en el archivo:

  • Si es un valor String, se guarda como un archivo de texto con codificación UTF-8.

  • Si es un objeto XML, se escribe en un archivo en formato XML (conservando todo el formato).

  • Si es un objeto Array, su contenido se escribe directamente en el archivo sin conversión alguna.

  • Si es cualquier otro objeto, el método FileReference.save() llama al método toString() del objeto y guarda el valor String resultante en un archivo de texto UTF-8. Si no se puede llamar al método toString() del objeto, se emite un error.

Si el valor del parámetro data es null , se genera un error.

El siguiente código amplía el ejemplo anterior para el método FileReference.load() . Una vez leídos los datos del archivo, este ejemplo solicita al usuario que especifique un nombre de archivo y, a continuación, guarda los datos en un nuevo archivo:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample2 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample2() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            fileRef.removeEventListener(Event.SELECT, onFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onComplete); 
            fileRef.removeEventListener(Event.CANCEL, onCancel); 
            saveFile(); 
        } 
        public function saveFile():void 
        { 
            fileRef.addEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.save(fileRef.data,"NewFileName.txt"); 
        } 
 
        public function onSaveFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.addEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.addEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveProgress(evt:ProgressEvent):void 
        { 
            trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
         
        public function onSaveComplete(evt:Event):void 
        { 
            trace("File saved."); 
            fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.removeEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveCancel(evt:Event):void 
        { 
            trace("The save request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

Si todos los datos se cargan desde el archivo, el código llama al método onComplete() . El método onComplete() elimina los detectores de los eventos de carga y seguidamente llama al método saveFile() . El método saveFile() llama a FileReference.save() . El método FileReference.save() abre un nuevo cuadro de diálogo para que el usuario pueda indicar un nuevo nombre de archivo y ubicación para guardarlo. Los métodos de detectores de eventos restantes realizan el seguimiento del progreso de grabación del archivo hasta que finaliza.

En Adobe AIR, la clase FileStream proporciona funcionalidad adicional para escribir datos en un archivo local. Consulte Lectura y escritura de archivos .

Cargar archivos en un servidor

Para cargar archivos en un servidor, hay que llamar primero al método browse() para permitir que un usuario seleccione uno o varios archivos. A continuación, cuando se llama al método FileReference.upload() , el archivo seleccionado se transfiere al servidor. Si el usuario ha seleccionado varios archivos con el método FileReferenceList.browse() , Flash Player crea un conjunto de archivos seleccionados denominado FileReferenceList.fileList . A continuación, se puede utilizar el método FileReference.upload() para cargar cada archivo de forma individual.

Nota: la utilización del método FileReference.browse() permite cargar únicamente archivos individuales. Para permitir que un usuario cargue varios archivos, es necesario utilizar el método FileReferenceList.browse() .

De forma predeterminada, el cuadro de diálogo del selector de archivos del sistema permite a los usuarios seleccionar cualquier tipo de archivo del equipo local, aunque los desarrolladores pueden especificar uno o varios filtros personalizados de tipo de archivo. Para ello, deben utilizar la clase FileFilter y pasar un conjunto de instancias de filtro de archivos al método browse() :

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var allTypes:Array = new Array(imageTypes, textTypes); 
var fileRef:FileReference = new FileReference(); 
fileRef.browse(allTypes);

Cuando el usuario ha seleccionado los archivos y ha hecho clic en el botón Abrir en el selector de archivos del sistema, se distribuye el evento Event.SELECT . Si se ha utilizado el método FileReference.browse() para seleccionar un archivo para cargarlo, es necesario utilizar el siguiente código para enviar el archivo a un servidor web:

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    var success:Boolean = fileRef.browse(); 
} 
catch (error:Error) 
{ 
    trace("Unable to browse for files."); 
} 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") 
    try 
    { 
        fileRef.upload(request); 
    } 
    catch (error:Error) 
    { 
        trace("Unable to upload file."); 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}
Para enviar datos al servidor con el método FileReference.upload() , se pueden utilizar las propiedades URLRequest.method y URLRequest.data para enviar variables con los métodos POST o GET .

Cuando se intenta cargar un archivo con el método FileReference.upload() , se pueden distribuir los siguientes eventos:

  • Evento open ( Event.OPEN ): se distribuye cuando se inicia la operación de carga.

  • Evento progress ( ProgressEvent.PROGRESS ): se distribuye periódicamente a medida que se cargan los bytes de datos del archivo.

  • Evento complete ( Event.COMPLETE ): se distribuye cuando la operación de carga finaliza correctamente.

  • Evento httpStatus ( HTTPStatusEvent.HTTP_STATUS ): se distribuye cuando el proceso de carga falla debido a un error HTTP.

  • Evento httpResponseStatus ( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): se distribuye si una llamada a los métodos upload() o uploadUnencoded() intenta acceder a los datos mediante HTTP y Adobe AIR puede detectar y devolver el código de estado de la petición.

  • Evento securityError ( SecurityErrorEvent.SECURITY_ERROR ): se distribuye cuando se produce un error en la carga debido a una infracción de la seguridad.

  • Evento uploadCompleteData ( DataEvent.UPLOAD_COMPLETE_DATA ): se distribuye cuando se han recibido datos del servidor tras una carga correcta.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): se distribuye si falla el proceso de carga por cualquiera de los siguientes motivos:

    • Se produce un error de entrada/salida mientras Flash Player lee, escribe o transmite el archivo.

    • El archivo SWF intenta cargar un archivo en un servidor que requiere autenticación, por ejemplo, un nombre de usuario y una contraseña. Durante la carga, Flash Player no proporciona un medio para que los usuarios introduzcan contraseñas.

    • El parámetro url contiene un protocolo no válido. El método FileReference.upload() debe utilizar HTTP o HTTPS.

Flash Player no ofrece compatibilidad total con los servidores que requieren autenticación. Únicamente los archivos SWF que se ejecutan en un navegador y emplean el plugin de navegador o un control Microsoft ActiveX®, pueden mostrar un cuadro de diálogo que indique al usuario que introduzca un nombre de usuario y una contraseña para la autenticación y, además, solo para descargas. La transferencia de archivos no se producirá correctamente en las cargas que utilicen el plug-in o el control ActiveX, o en las cargas y descargas que utilicen el reproductor autónomo o externo.

Si se crea un script de servidor en ColdFusion para aceptar una carga de archivos desde Flash Player, se puede utilizar un código similar al siguiente:

<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

Este código de ColdFusion carga el archivo enviado por Flash Player y lo guarda en el mismo directorio que la plantilla de ColdFusion, sobrescribiendo cualquier archivo con el mismo nombre. El código anterior muestra la cantidad mínima de código necesario para aceptar una carga de archivos; este script no debería utilizarse en un entorno de producción. Lo ideal sería añadir validación de datos para garantizar que los usuarios solo cargan tipos de archivos aceptados como, por ejemplo, una imagen, en lugar de un script de servidor potencialmente peligroso.

El siguiente código muestra cargas de archivos mediante PHP e incluye validación de datos. El script limita en 10 el número de archivos cargados en el directorio de carga, garantiza que el tamaño de archivo es inferior a 200 KB, y solo permite cargar y guardar archivos JPEG, GIF o PNG en el sistema de archivos.

<?php 
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB 
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server 
echo exif_imagetype($_FILES['Filedata']); 
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) 
{ 
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); 
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); 
    if ($type == 1 || $type == 2 || $type == 3) 
    { 
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); 
    } 
    else 
    { 
        unlink("./temporary/".$_FILES['Filedata']['name']); 
    } 
} 
$directory = opendir('./images/'); 
$files = array(); 
while ($file = readdir($directory)) 
{ 
    array_push($files, array('./images/'.$file, filectime('./images/'.$file))); 
} 
usort($files, sorter); 
if (count($files) > $MAXIMUM_FILE_COUNT) 
{ 
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); 
    for ($i = 0; $i < count($files_to_delete); $i++) 
    { 
        unlink($files_to_delete[$i][0]); 
    } 
} 
print_r($files); 
closedir($directory); 
 
function sorter($a, $b) 
{ 
    if ($a[1] == $b[1]) 
    { 
        return 0; 
    } 
    else 
    { 
        return ($a[1] < $b[1]) ? -1 : 1; 
    } 
} 
?>

Se pueden pasar variables adicionales al script de carga mediante el método de petición POST o GET . Para enviar variables adicionales de POST al script de carga, se puede utilizar el siguiente código:

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
fileRef.browse(); 
function selectHandler(event:Event):void 
{ 
    var params:URLVariables = new URLVariables(); 
    params.date = new Date(); 
    params.ssid = "94103-1394-2345"; 
    var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); 
    request.method = URLRequestMethod.POST; 
    request.data = params; 
    fileRef.upload(request, "Custom1"); 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

El ejemplo anterior crea un objeto URLVariables que se transmite al script del servidor remoto. En versiones anteriores de ActionScript, se podían pasar variables al script de carga del servidor pasando valores en la cadena de consulta. ActionScript 3.0 permite pasar variables al script remoto con un objeto URLRequest, que permite pasar datos mediante el método POST o GET que, a su vez, hace más sencillo pasar grandes conjuntos de datos. Para especificar si las variables se pasan con el método de petición GET o POST , se puede establecer la propiedad URLRequest.method en URLRequestMethod.GET o URLRequestMethod.POST , respectivamente.

ActionScript 3.0 también permite sustituir el nombre del campo de archivo de carga predeterminado, Filedata , proporcionando un segundo parámetro al método upload() , como se muestra en el ejemplo anterior (que sustituía el valor predeterminado Filedata por Custom1 ).

De forma predeterminada, Flash Player no intentará enviar una carga de prueba, aunque este valor predeterminado se puede omitir pasando un valor de true como tercer parámetro al método upload() . El objetivo de la carga de prueba es comprobar si la carga de archivos real se realizará correctamente, así como la autenticación del servidor, en caso de ser necesaria.

Nota: actualmente, la carga de prueba solo puede realizarse en Flash Player basado en Windows.

El script de servidor que gestiona la carga de archivos espera una petición HTTP POST con los siguientes elementos:

  • Content-Type con un valor multipart/form-data .

  • Content-Disposition con un atributo name establecido en " Filedata " y un atributo filename establecido en el nombre del archivo original. Se puede especificar un atributo name personalizado pasando un valor para el parámetro uploadDataFieldName en el método FileReference.upload() .

  • El contenido binario del archivo.

A continuación se muestra un ejemplo de petición HTTP POST :

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6  
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
Test File  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
(actual file data,,,)

La siguiente petición de ejemplo HTTP POST envía tres variables POST : api_sig , api_key y auth_token y utiliza un valor de nombre de campo de datos de carga personalizado de "photo" :

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_sig" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_key" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="auth_token" 
 
XXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="photo"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
(actual file data,,,) 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Descarga de archivos de un servidor

Para permitir que los usuarios descarguen archivos de un servidor, se utiliza el método FileReference.download() , que utiliza dos parámetros request y defaultFileName . El primer parámetro es el objeto URLRequest que contiene el URL del archivo para descargar. El segundo parámetro es opcional y permite especificar un nombre de archivo predeterminado que aparece en el cuadro de diálogo del archivo descargado. Si se omite el segundo parámetro, defaultFileName , se utiliza el nombre de archivo del URL especificado.

El siguiente código descarga un archivo denominado index.xml desde el mismo directorio que el archivo SWF:

var request:URLRequest = new URLRequest("index.xml"); 
var fileRef:FileReference = new FileReference(); 
fileRef.download(request);

Para establecer currentnews.xml como nombre predeterminado, en lugar de index.xml, es necesario especificar el parámetro defaultFileName , como se muestra en el siguiente fragmento de código:

var request:URLRequest = new URLRequest("index.xml"); 
var fileToDownload:FileReference = new FileReference(); 
fileToDownload.download(request, "currentnews.xml");

Cambiar el nombre de un archivo puede ser muy útil si el nombre de archivo del servidor no es intuitivo o ha sido generado por el servidor. También se recomienda especificar de forma explícita el parámetro defaultFileName cuando se descarga un archivo mediante un script de servidor, en lugar de descargarlo directamente. Por ejemplo, es necesario especificar el parámetro defaultFileName si se dispone de un script de servidor que descarga archivos específicos en función de las variables de URL que se le pasan. De lo contrario, el nombre predeterminado del archivo descargado es el nombre del script de servidor.

Es posible enviar datos al servidor mediante el método download() añadiendo parámetros al URL, para que los analice el script de servidor. El siguiente fragmento de código ActionScript 3.0 descarga un documento en función de los parámetros pasados a un script de ColdFusion:

package 
{ 
    import flash.display.Sprite; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
 
    public class DownloadFileExample extends Sprite 
    { 
        private var fileToDownload:FileReference; 
        public function DownloadFileExample() 
        { 
            var request:URLRequest = new URLRequest(); 
            request.url = "http://www.[yourdomain].com/downloadfile.cfm"; 
            request.method = URLRequestMethod.GET; 
            request.data = new URLVariables("id=2"); 
            fileToDownload = new FileReference(); 
            try 
            { 
                fileToDownload.download(request, "file2.txt"); 
            } 
            catch (error:Error) 
            { 
                trace("Unable to download file."); 
            } 
        } 
    } 
}

El siguiente código muestra el script ColdFusion, download.cfm, que descarga uno de los dos archivos del servidor, dependiendo del valor de una variable de URL:

<cfparam name="URL.id" default="1" /> 
<cfswitch expression="#URL.id#"> 
    <cfcase value="2"> 
        <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> 
    </cfcase> 
    <cfdefaultcase> 
        <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> 
    </cfdefaultcase> 
</cfswitch>

Clase FileReferenceList

La clase FileReferenceList permite al usuario seleccionar uno o varios archivos para cargarlos en un script de servidor. La carga de archivos se controla mediante el método FileReference.upload() , al que es necesario llamar en cada archivo que selecciona el usuario.

El siguiente código crea dos objetos FileFilter ( imageFilter y textFilter ) y los pasa en un conjunto al método FileReferenceList.browse() . Como consecuencia, el cuadro de diálogo del archivo del sistema operativo muestra dos filtros de tipos de archivo posibles.

var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var fileRefList:FileReferenceList = new FileReferenceList(); 
try 
{ 
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); 
} 
catch (error:Error)  
{ 
    trace("Unable to browse for files."); 
}

Permitir al usuario seleccionar y cargar uno o varios archivos mediante la clase FileReferenceList equivale a utilizar FileReference.browse() para seleccionar archivos, aunque FileReferenceList permite seleccionar más de un archivo. Para cargar varios archivos es necesario actualizar cada uno de los archivos seleccionados mediante FileReference.upload() , como se muestra en el siguiente código:

var fileRefList:FileReferenceList = new FileReferenceList(); 
fileRefList.addEventListener(Event.SELECT, selectHandler); 
fileRefList.browse(); 
 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); 
    var file:FileReference; 
    var files:FileReferenceList = FileReferenceList(event.target); 
    var selectedFileArray:Array = files.fileList; 
    for (var i:uint = 0; i < selectedFileArray.length; i++) 
    { 
        file = FileReference(selectedFileArray[i]); 
        file.addEventListener(Event.COMPLETE, completeHandler); 
        try 
        { 
            file.upload(request); 
        } 
        catch (error:Error) 
        { 
            trace("Unable to upload files."); 
        } 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

Dado que el evento Event.COMPLETE se añade a cada objeto FileReference individual del conjunto, Flash Player llama al método completeHandler() cuando finaliza la carga de cada uno de los archivos.