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.
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:
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.
|
|
|