Uso da classe FileReference

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Um objeto FileReference representa um arquivo de dados em um computador cliente ou servidor. Os métodos da classe FileReference permitem que o seu aplicativo carregue e salve os arquivos de dados localmente, além de transferir dados de arquivos para ou de servidores remotos.

A classe FileReference oferece duas abordagens diferentes para carregar, transferir e salvar arquivos de dados. Desde sua introdução, a classe FileReference contém o método browse() , o método upload() , e o método download() . Use o método browse() para permitir que o usuário selecione um arquivo. Use o método upload() para transferir os dados do arquivo para um servidor remoto. Use o método download() para acessar esses dados no servidor e salvá-los em um arquivo local. A partir do Flash Player 10 e do Adobe AIR 1.5, a classe FileReference contém os métodos load() e save() . Os métodos load() e save() também permitem que você acesse e salve diretamente os arquivos locais. O uso desses métodos é semelhante ao dos métodos de nome equivalente nas classes URLLoader e Loader.

Nota: A classe File, que estende a classe FileReference, e a classe FileStream fornecem funções adicionais para trabalhar com arquivos e com o sistema de arquivos local. As classes File e FileStream são só suportadas no AIR e não no Flash Player.

Adobe recomenda

Carregar e salvar arquivos locais

Kevin Hoyt
Neste vídeo, Kevin Hoyt revela a facilidade de carregar e salvar conteúdo local usando o Flash.

classe FileReference

Cada objeto FileReference representa um arquivo de dados único no computador local. As propriedades da classe FileReference contêm informações sobre as seguintes características do arquivo: tamanho, tipo, nome, extensão do nome de arquivo, criador, data de criação e data de modificação.

Nota: Há suporte para a propriedade creator apenas no Mac OS. Todas as outras plataformas retornam null .
Nota: A propriedade extension é suportada somente no Adobe AIR.

Você pode criar uma ocorrência da classe FileReference de duas maneiras:

  • Use o operador new , conforme apresentado no código a seguir:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Chame o método FileReferenceList.browse() , que abre uma caixa de diálogo que solicita ao usuário selecionar um ou mais arquivos para carregar. Ele pode criar uma matriz de objetos FileReference se o usuário conseguir selecionar um ou mais arquivos.

Após criar um objeto FileReference, você pode proceder da seguinte maneira:

  • Chame o método FileReference.browse() , que abre uma caixa de diálogo que solicita ao usuário selecionar um ou mais arquivos no sistema de arquivos local. Normalmente, isso é feito antes de uma chamada subsequente ao método FileReference.upload() ou FileReference.load() . Chame o método FileReference.upload() para transferir o arquivo a um servidor remoto. Chame o método FileReference.load() para abrir um arquivo local.

  • Chame o método FileReference.download() . Será aberta uma caixa de diálogo pelo método download() para possibilitar a seleção de um local para gravação de um novo arquivo. Em seguida, os dados do servidor serão baixados e armazenados no novo arquivo.

  • Chame o método FileReference.load() . Este método começa a carregar dados de um arquivo previamente selecionado usando o método browse() . O método load() não pode ser chamado até a operação browse() ser concluída (até o usuário selecionar um arquivo).

  • Chame o método FileReference.save() . Este método abre uma caixa de diálogo e pede para o usuário escolher uma única localização de arquivo no sistema de arquivos local. Em seguida, ele salva os dados no local especificado.

Nota: Você pode executar apenas uma ação browse() , download() ou save() de cada vez, porque só pode ser aberta uma caixa de diálogo a qualquer momento.

As propriedades do objeto FileReference, como name , size ou modificationDate não são definidas até que ocorra um dos eventos a seguir:

  • O método FileReference.browse() ou o método FileReferenceList.browse() foi chamado e o usuário selecionou um arquivo usando a caixa de diálogo.

  • O método FileReference.download() foi chamado e o usuário especificou um novo local para os arquivos usando a caixa de diálogo.

Nota: Ao fazer um download, apenas a propriedade FileReference.name é preenchida antes do download ser concluído. Após o download do arquivo, todas as propriedades estão disponíveis.

Enquanto as chamadas dos métodos FileReference.browse() , FileReferenceList.browse() , FileReference.download() , FileReference.load() ou FileReference.save() estão em execução, a maioria dos players continua reproduzindo arquivos SWF, inclusive despachando eventos e executando código.

Para operações de upload e download, um arquivo SWF pode acessar arquivos apenas em seu próprio domínio, incluindo todos os domínios especificados por um arquivo de política. Você deve colocar um arquivo de política no servidor que contém o arquivo se esse servidor não está no mesmo domínio do arquivo SWF que está iniciando o upload ou o download.

See FileReference .

Carregamento de dados de arquivos

O método FileReference.load() permite carregar dados de um arquivo local na memória.

Nota: O seu código deve chamar primeiro o método FileReference.browse() para que o usuário possa selecionar um arquivo a ser carregado. Essa restrição não se aplica ao conteúdo que está em execução no Adobe AIR na caixa de segurança do aplicativo

O método FileReference.load() retorna imediatamente depois de ser chamado, mas os dados que estão sendo carregados não ficam disponíveis de imediato. O objeto FileReference despacha eventos para chamar métodos de ouvinte em cada etapa do processo de carregamento.

O objeto FileReference despacha os eventos a seguir durante o processo de carregamento.

  • Evento open ( Event.OPEN ): despachado quando uma operação de carregamento é iniciada.

  • Evento progress ( ProgressEvent.PROGRESS ): despachado periodicamente na medida em que os dados do arquivo são lidos.

  • Evento complete ( Event.COMPLETE ): despachado quando a operação de carregamento é concluída com sucesso.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): despachado se o processo de carregamento falha devido a um erro de entrada/saída ocorrido durante a abertura ou a leitura de dados do arquivo.

Uma vez que o objeto FileReference despacha o evento complete, os dados carregados podem ser acessados como um ByteArray na propriedade data do objeto FileReference.

O exemplo a seguir mostra como solicitar ao usuário que selecione um arquivo e carregue os dados do arquivo na memória:

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."); 
        } 
    } 
}

O código do exemplo primeiro cria o objeto FileReference chamado fileRef e depois chama o método browse() correspondente. Este método browse() abre uma caixa de diálogo que pede para o usuário selecionar um arquivo. Quando um arquivo é selecionado, o código chama o método onFileSelected() . Este método adiciona ouvintes dos eventos progress e complete e chama o método load() do objeto FileReference. Os outros métodos do manipulador citados no exemplo simplesmente geram mensagens que informam o andamento da operação de carregamento. Quando o carregamento for concluído, o aplicativo exibe o conteúdo do arquivo carregado usando o método trace() .

No Adobe AIR, a classe FileStream fornece uma funcionalidade extra para ler dados de um arquivo local. Consulte Leitura e gravação de arquivos .

Gravação de dados em arquivos locais

O método FileReference.save() permite salvar dados em um arquivo local. Ele é iniciado ao abrir uma caixa de diálogo para permitir ao usuário digitar um novo nome para o arquivo e definir um local onde o arquivo será salvo. Após a seleção do nome do arquivo e do local, os dados são gravados no novo arquivo. Quando o arquivo for salvo com êxito, as propriedades do objeto FileReference serão preenchidas com as propriedades do arquivo local.

Nota: O código só pode chamar o método FileReference.save() em resposta a um evento de usuário, como um clique do mouse ou um evento de pressionamento de tecla. Caso contrário, é gerado um erro. Essa restrição não se aplica ao conteúdo que está em execução no Adobe AIR na caixa de segurança do aplicativo.

O método FileReference.save() é retornado imediatamente após a chamada. Em seguida, o objeto FileReference envia eventos para chamar métodos de ouvintes em cada etapa do processo de gravação do arquivo.

O objeto FileReference despacha os eventos a seguir durante o processo de gravação do arquivo:

  • Evento select ( Event.SELECT ): despachado quando o usuário especifica o local e o nome de arquivo para o novo arquivo a ser salvo.

  • Evento cancel ( Event.CANCEL ): despachado quando o usuário clica no botão Cancelar da caixa de diálogo.

  • Evento open ( Event.OPEN ): despachado quando uma operação de salvamento é iniciada.

  • Evento progress ( ProgressEvent.PROGRESS ): despachado periodicamente na medida em que os dados são gravados no arquivo.

  • Evento complete ( Event.COMPLETE ): despachado quando a operação de gravação é concluída com sucesso.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): despachado se o processo de salvamento falha devido a um erro de entrada/saída ocorrido durante a tentativa de salvar dados no arquivo.

O tipo de objeto transmitido no parâmetro data do método FileReference.save() determina como os dados são gravados no arquivo:

  • Se for um valor String, os dados serão salvos como um arquivo de texto na codificação UTF-8.

  • Se for um objeto XML, eles serão gravados em um arquivo no formato XML com toda a formatação preservada.

  • Se for um objeto ByteArray, seu conteúdo será gravado diretamente no arquivo, sem conversão.

  • Se for outro objeto, o método FileReference.save() chamará o método toString() do objeto e salvará o valor String resultante em um arquivo de texto UTF-8. Se não for possível chamar o método toString() do objeto, será gerado um erro.

Se o valor do parâmetro data for null , será gerado um erro.

O código a seguir amplia o exemplo anterior do método FileReference.load() . Após a leitura dos dados do arquivo, esse exemplo solicita ao usuário um nome de arquivo e, em seguida, salva os dados em um novo arquivo:

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."); 
        } 
    } 
}

Quando todos os dados forem carregados do arquivo, o código chamará o método onComplete() . O método onComplete() remove os ouvintes dos eventos de carregamento e, em seguida, chama o método saveFile() . O método saveFile() chama o método FileReference.save() . O método FileReference.save() abre uma nova caixa de diálogo na qual o usuário pode digitar um novo nome e um local para salvar o arquivo. Os métodos restantes do ouvinte de eventos rastreiam o andamento do processo de gravação do arquivo até que seja concluído.

No Adobe AIR, a classe FileStream fornece uma funcionalidade extra para gravar dados em um arquivo local. Consulte Leitura e gravação de arquivos .

Upload de arquivos em um servidor

Para carregar arquivos para um servidor, chame primeiro o método browse() para permitir que um usuário selecione um ou mais arquivos. Em seguida, quando o método FileReference.upload() é chamado, o arquivo selecionado é transferido para o servidor. Se o usuário seleciona vários arquivos usando o método FileReferenceList.browse() , o Flash Player cria uma matriz dos arquivos selecionados chamada FileReferenceList.fileList . Em seguida, você pode usar o método FileReference.upload() para carregar cada arquivo individualmente.

Nota: O uso do método FileReference.browse() permite carregar apenas arquivos únicos. Para permitir que um usuário carregue vários arquivos, use o método FileReferenceList.browse() .

Por padrão, a caixa de diálogo de seletor de arquivos do sistema permite que os usuários selecionem qualquer tipo de arquivo do computador local. Os desenvolvedores podem especificar um ou mais filtros do tipo de arquivo personalizado usando a classe FileFilter e transmitindo uma matriz de instâncias de filtros de arquivo para o 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);

Quando o usuário seleciona os arquivos e clica no botão Abrir no seletor de arquivos do sistema, o evento Event.SELECT é enviado. Se o método FileReference.browse() for usado para selecionar um arquivo a ser carregado, o seguinte código enviará o arquivo a um 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"); 
}
Você pode enviar dados ao servidor com o método FileReference.upload() usando as propriedades URLRequest.method e URLRequest.data para enviar variáveis que usam os métodos POST ou GET .

Quando você tenta carregar um arquivo usando o método FileReference.upload() , os seguintes eventos são despachados:

  • Evento open ( Event.OPEN ): despachado quando uma operação de upload é iniciada.

  • Evento progress ( ProgressEvent.PROGRESS ): despachado periodicamente na medida em que os dados do arquivo são carregados.

  • Evento complete ( Event.COMPLETE ): despachado quando a operação de upload é concluída com sucesso.

  • Evento httpStatus ( HTTPStatusEvent.HTTP_STATUS ): despachado quando há uma falha no processo de upload devido a um erro HTTP.

  • Evento httpResponseStatus ( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): Despachado se uma chamada do método upload() ou uploadUnencoded() tentar acessar os dados através de HTTP e o Adobe AIR puder detectar e retornar o código de status da solicitação.

  • Evento securityError ( SecurityErrorEvent.SECURITY_ERROR ): despachado quando há uma falha na operação de upload devido a uma violação de segurança.

  • Evento uploadCompleteData ( DataEvent.UPLOAD_COMPLETE_DATA ): despachado quando os dados são recebidos do servidor após um upload bem-sucedido.

  • Evento ioError ( IOErrorEvent.IO_ERROR ): despachado se houver falha no processo de upload por qualquer um dos seguintes motivos:

    • Ocorreu um erro de entrada/saída enquanto o Flash Player estava lendo, gravando ou transmitindo o arquivo.

    • O SWF tentou carregar um arquivo para um servidor que requer autenticação (como um nome de usuário e senha). Durante o upload, o Flash Player não fornece um meio para os usuários inserirem senhas.

    • O parâmetro url contém um protocolo inválido. O método FileReference.upload() deve usar HTTP ou HTTPS.

O Flash Player não oferece suporte completo para servidores que requerem autenticação. Apenas arquivos SWF que estão em execução em um navegador que usa o plug-in do navegador ou o controle Microsoft ActiveX® podem fornecer uma caixa de diálogo para solicitar que o usuário digite um nome de usuário e senha para autenticação e apenas para downloads. Ocorre falha na transferência de arquivos, para uploads que usam o plug-in ou o controle ActiveX, ou upload/download que usa player autônomo ou externo.

Para criar um script de servidor no ColdFusion para aceitar um upload de arquivo do Flash Player, você pode usar um código semelhante a este:

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

Esse código ColdFusion carrega o arquivo enviado pelo Flash Player e salva-o no mesmo diretório que o modelo ColdFusion, substituindo qualquer arquivo com o mesmo nome. O código anterior mostra a quantidade mínima básica de código necessária para aceitar um upload de arquivo. Esse script não deve ser usado em um ambiente de produção. Em condições ideais, adicione validação de dados para garantir que os usuários carreguem apenas tipos de arquivo aceitos, como uma imagem, em vez de um script do lado do servidor potencialmente perigoso.

O código a seguir demonstra uploads de arquivo usando PHP e inclui validação de dados. O script limita o número de arquivos carregados no diretório de upload até 10, garante que o arquivo tenha menos do que 200 KB e permite que apenas arquivos JPEG, GIF ou PNG sejam carregados e salvos no sistema de arquivos.

<?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; 
    } 
} 
?>

Você pode transmitir variáveis adicionais para o script de upload usando o método de solicitação POST ou o GET . Para enviar variáveis POST adicionais ao script de upload, use o seguinte 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"); 
}

O exemplo anterior cria um objeto URLVariables que você transmite para o script do lado do servidor remoto. Em versões anteriores do ActionScript, era possível transmitir variáveis para o script de upload de servidor transmitindo valores na string da consulta. O ActionScript 3.0 permite transmitir variáveis para o script remoto usando um objeto URLRequest, o que permite que você transmita dados usando o método POST ou o GET . Isso, por sua vez, faz com que a transmissão de conjuntos de dados maiores seja mais fácil e mais limpa. Para especificar se a variáveis são transmitidas usando o método de solicitação GET ou POST , defina a propriedade URLRequest.method como URLRequestMethod.GET ou URLRequestMethod.POST , respectivamente.

O ActionScript 3.0 também permite substituir o nome do campo do arquivo de upload Filedata padrão fornecendo um segundo parâmetro para o método upload() , conforme demonstrado no exemplo anterior (que substituiu o valor padrão Filedata por Custom1 ).

Por padrão, o Flash Player não tenta enviar um upload de teste, embora seja possível substituir esse padrão transmitindo um valor true como o terceiro parâmetro para o método upload() . A finalidade do upload de teste é verificar se o upload do arquivo real será bem-sucedido e se a autenticação do servidor, se necessária, terá êxito.

Nota: No momento, um upload de teste ocorre apenas em Flash Players com base no Windows.

O script de servidor que manipula o upload do arquivo deve esperar uma solicitação POST HTTP com os seguintes elementos:

  • Content-Type com um valor de multipart/form-data.

  • Content-Disposition com um atributo name definido como “ Filedata ” e um atributo filename definido como o nome do arquivo original. É possível especificar um atributo name personalizado, transmitindo um valor para o parâmetro uploadDataFieldName no método FileReference.upload() .

  • O conteúdo binário do arquivo.

Esta é uma solicitação POST HTTP de amostra:

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,,,)

A seguinte solicitação POST HTTP de amostra envia três variáveis POST : api_sig , api_key e auth_token e usa um valor de nome de campo de dados de upload 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--

Download de arquivos de um servidor

É possível permitir que os usuários baixem arquivos de um servidor usando o método FileReference.download() que utiliza dois parâmetros: request e defaultFileName . O primeiro parâmetro é o objeto URLRequest que contém a URL do arquivo a ser baixado. O segundo parâmetro é opcional, ele permite especificar um nome de arquivo padrão que aparece na caixa de diálogo do arquivo de download. Se você omitir o segundo parâmetro, defaultFileName , o nome de arquivo da URL especificada será usado.

O código a seguir baixa um arquivo denominado index.xml do mesmo diretório que o arquivo SWF:

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

Para definir o nome padrão como currentnews.xml, em vez de index.xml, especifique o parâmetro defaultFileName , conforme mostrado no seguinte snippet:

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

Renomear um arquivo poderá ser útil se o nome de arquivo do servidor não for intuitivo ou gerado pelo servidor. Também é bom especificar explicitamente o parâmetro defaultFileName ao baixar um arquivo usando um script do lado do servidor, em vez de baixar o arquivo diretamente. Por exemplo, você precisa especificar o parâmetro defaultFileName , se tiver um script do lado do servidor que baixe arquivos específicos com base em variáveis de URL transmitidas para ele. Caso contrário, o nome padrão do arquivo baixado será o nome do script do lado do servidor.

Os dados podem ser enviados ao servidor usando o método download() anexando parâmetros à URL para análise pelo script do servidor. O seguinte snippet do ActionScript 3.0 baixa um documento com base em quais parâmetros são transmitidos para um script 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."); 
            } 
        } 
    } 
}

O código a seguir demonstra o script ColdFusion, download.cfm, que baixa um de dois arquivos do servidor, dependendo do valor de uma variável 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>

classe FileReferenceList

A classe FileReferenceList permite que o usuário selecione um ou mais arquivos a serem carregados para um script do lado do servidor. O upload de arquivo é manipulado pelo método FileReference.upload() que deve ser chamado em cada arquivo selecionado pelo usuário.

O código a seguir cria dois objetos FileFilter ( imageFilter e textFilter ) e transmite-os em uma matriz para o método FileReferenceList.browse() . Isso faz com que a caixa de diálogo de arquivo do sistema operacional exiba dois filtros possíveis para tipos de arquivos.

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 que o usuário selecione e carregue um ou mais arquivos usando a classe FileReferenceList é o mesmo que usar FileReference.browse() para selecionar arquivos, embora o FileReferenceList permita selecionar mais de um arquivo. O upload de vários arquivos requer que você carregue cada um dos arquivos selecionados usando FileReference.upload() , conforme mostrado no código a seguir:

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"); 
}

Como o evento Event.COMPLETE é adicionado a cada objeto FileReference individual na matriz, o Flash Player chama o método completeHandler() quando o upload de cada arquivo individual é concluído.