Uploads de arquivos com o Flash 8

Baixe o FLA

Fazer uploads de arquivos pelo Flash foi algo que precisei fazer para um trabalho mas na época o Flash não dava suporte a isso, tive que fazer uma gambiarra com javascript, mas agora junto as novas classes que foram incluídas no Flash 8 está uma que venho precisando a algum tempo, a classe FileReference, essa classe já existia no Macromedia Central, justamente para fazer uploads de arquivos com o Flash, veremos como implementar esse recurso.
Abra um arquivo novo, na primeira camada, aperte F9 para abrir o painel “Actions�?.
Vamos importa para o swf as classes necessárias para fazer o upload de arquivos.

[as]import flash.net.FileReference;[/as]

Criando um objeto ouvinte para usar os métodos onSelect, onOpen, onComplete, onHTTPError, onIOError, onSecurityError, onProgress.

[as]var listener:Object = new Object();
listener.onSelect = function(selectedFile:FileReference):Void {
statusArea.text += “Attempting to upload “+selectedFile.name+”\n”;
selectedFile.upload(“http://dominio/upload.php”);
};
listener.onOpen = function(selectedFile:FileReference):Void {
statusArea.text += “Opening “+selectedFile.name+”\n”;
};
listener.onComplete = function(selectedFile:FileReference):Void {
statusArea.text += “Downloading “+selectedFile.name+” to player\n”;
load_img.load();
load_img.contentPath = “http://dominio/img/”+selectedFile.name;
}
;listener.onHTTPError = function(selectedFile:FileReference):Void {
statusArea.text += “onHTTPError: “+selectedFile.name;
};
listener.onIOError = function(selectedFile:FileReference):Void {
statusArea.text += “onIOError: “+selectedFile.name;
};
listener.onSecurityError = function(selectedFile:FileReference, errorString:String):Void {
statusArea.text += “onSecurityError: “+selectedFile.name+” errorString: “+errorString;
};
listener.onProgress = function(selectedFile:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
statusArea.text += “onProgress with bytesLoaded: “+bytesLoaded+” bytesTotal: “+bytesTotal;
};[/as]

Criando uma instância da classe FileReference

[as]var imageFile:FileReference = new FileReference();[/as]

Adicionando nossos ouvintes a instancia criada.

[as]imageFile.addListener(listener);[/as]

Criando o botão, o textarea e o loader dinamicamente, necessário que esses componentes estejam na biblioteca do filme.

[as]var bot = _root.createClassObject(mx.controls.Button, “bot”, _root.getNextHighestDepth(), {label:”Upload”, _x:225});
bot.onRelease = function() {
imageFile.browse([{description:”Image Files”, extension:”*.jpg;*.gif;*.png;”}]);
};
var load_img = _root.createClassObject(mx.controls.Loader, “load_img”, _root.getNextHighestDepth(), {_x:50, _y:22,_width:450, _height:270});
load_img.setStyle(“backgroundColor”, 0xEEEEEE);
var statusArea = _root.createClassObject(mx.controls.TextArea, “statusArea”, _root.getNextHighestDepth(), {_x:1, _y:300, _width:549, _height:100});[/as]

Repare que no metodo browse, podemos definir quais extensões serão permitidas para upload.

[as]imageFile.browse([{description:”Image Files”, extension:”*.jpg;*.gif;*.png;”}]);[/as]

Uma janela do explorer se abrirá assim que o botão for clicado. O arquivo para upload será enviado para nosso script em PHP que terminara de mandar o arquivo para o servidor. O script usando foi o seguinte:

Arquivo: upload.php
[as]< ?php $dir = 'img'; //path name of file for storage $uploadfile = "$dir/" . basename( $_FILES['Filedata']['name'] ); //if the file is moved successfully if ( move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $uploadfile ) ) { echo( '1 ' . $_FILES['Filedata']['name']); //file failed to move }else{ echo( '0'); }?>[/as]

O Código completo em Action Script:

[as]import flash.net.FileReference;
var listener:Object = new Object();
listener.onSelect = function(selectedFile:FileReference):Void {
statusArea.text += “Attempting to upload “+selectedFile.name+”\n”;
selectedFile.upload(“http://www.osfederais.com/upload.php”);
};
listener.onOpen = function(selectedFile:FileReference):Void {
statusArea.text += “Opening “+selectedFile.name+”\n”;
};
listener.onComplete = function(selectedFile:FileReference):Void {
statusArea.text += “Downloading “+selectedFile.name+” to player\n”;
load_img.load();
load_img.contentPath = “http://www.osfederais.com/img/”+selectedFile.name;
trace(“http://www.osfederais.com/img/”+selectedFile.name);
};
listener.onHTTPError = function(selectedFile:FileReference):Void {
statusArea.text += “onHTTPError: “+selectedFile.name;
};
listener.onIOError = function(selectedFile:FileReference):Void {
statusArea.text += “onIOError: “+selectedFile.name;
};
listener.onSecurityError = function(selectedFile:FileReference, errorString:String):Void {
statusArea.text += “onSecurityError: “+selectedFile.name+” errorString: “+errorString;
};
listener.onProgress = function(selectedFile:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
statusArea.text += “onProgress with bytesLoaded: “+bytesLoaded+”\n bytesTotal: “+bytesTotal+”\n”;
};
var imageFile:FileReference = new FileReference();
imageFile.addListener(listener);
var bot = _root.createClassObject(mx.controls.Button, “bot”, _root.getNextHighestDepth(), {label:”Upload”, _x:225});
bot.onRelease = function() {
imageFile.browse([{description:”Image Files”, extension:”*.jpg;*.gif;*.png;”}]);
};
var load_img = _root.createClassObject(mx.controls.Loader, “load_img”, _root.getNextHighestDepth(), {_x:50, _y:22,_width:450, _height:270});
load_img.setStyle(“backgroundColor”, 0xEEEEEE);
var statusArea = _root.createClassObject(mx.controls.TextArea, “statusArea”, _root.getNextHighestDepth(), {_x:1, _y:300, _width:549, _height:100});[/as]

*UPDATE* 09/07/2006
Segue exemplos em outras linguagens, claro que sem testar 😉
Em ASP fonte: http://board.flashkit.com/board/archive/index.php/t-649912.html
[asp]
Class Loader
Private dict

Private Sub Class_Initialize
Set dict = Server.CreateObject(“Scripting.Dictionary”)
End Sub

Private Sub Class_Terminate
If IsObject(intDict) Then
intDict.RemoveAll
Set intDict = Nothing
End If
If IsObject(dict) Then
dict.RemoveAll
Set dict = Nothing
End If
End Sub

Public Property Get Count
Count = dict.Count
End Property

Public Sub Initialize
If Request.TotalBytes > 0 Then
Dim binData
binData = Request.BinaryRead(Request.TotalBytes)
getData binData
End If
End Sub

Public Function saveToFile(name, path)
If dict.Exists(name) Then
Dim temp
temp = dict(name).Item(“Value”)
Dim fso
Set fso = Server.CreateObject(“Scripting.FileSystemObject”)
Dim file
Set file = fso.CreateTextFile(path)
For tPoint = 1 to LenB(temp)
file.Write Chr(AscB(MidB(temp,tPoint,1)))
Next
file.Close
saveToFile = True
Else
saveToFile = False
End If
End Function

Public Function getFileName(name)
If dict.Exists(name) Then
Dim temp, tempPos
temp = dict(name).Item(“FileName”)
tempPos = 1 + InStrRev(temp, “\””)
getFileName = Mid(temp, tempPos)
Else
getFileName = “”
End If
End Function

Private Sub getData(rawData)
Dim separator
separator = MidB(rawData, 1, InstrB(1, rawData, ChrB(13)) – 1)

Dim lenSeparator
lenSeparator = LenB(separator)

Dim currentPos
currentPos = 1
Dim inStrByte
inStrByte = 1
Dim value, mValue
Dim tempValue
tempValue = “”

While inStrByte > 0
inStrByte = InStrB(currentPos, rawData, separator)
mValue = inStrByte – currentPos

If mValue > 1 Then
value = MidB(rawData, currentPos, mValue)

Dim begPos, endPos, midValue, nValue
Dim intDict
Set intDict = Server.CreateObject(“Scripting.Dictionary”)

begPos = 1 + InStrB(1, value, ChrB(34))
endPos = InStrB(begPos + 1, value, ChrB(34))
nValue = endPos

Dim nameN
nameN = MidB(value, begPos, endPos – begPos)

Dim nameValue, isValid
isValid = True

If InStrB(1, value, stringToByte(“Content-Type”)) > 1 Then

begPos = 1 + InStrB(endPos + 1, value, ChrB(34))
endPos = InStrB(begPos + 1, value, ChrB(34))

If endPos = 0 Then
endPos = begPos + 1
isValid = False
End If

midValue = MidB(value, begPos, endPos – begPos)
intDict.Add “FileName”, trim(byteToString(midValue))

begPos = 14 + InStrB(endPos + 1, value, stringToByte(“Content-Type:”))
endPos = InStrB(begPos, value, ChrB(13))

midValue = MidB(value, begPos, endPos – begPos)
intDict.Add “ContentType”, trim(byteToString(midValue))

begPos = endPos + 4
endPos = LenB(value)

nameValue = MidB(value, begPos, ((endPos – begPos) – 1))
Else
nameValue = trim(byteToString(MidB(value, nValue + 5)))
End If

If isValid = True Then

intDict.Add “Value”, nameValue
intDict.Add “Name”, nameN

dict.Add byteToString(nameN), intDict
End If
End If

currentPos = lenSeparator + inStrByte
Wend
End Sub

End Class

Private Function stringToByte(toConv)
Dim tempChar
For i = 1 to Len(toConv)
tempChar = Mid(toConv, i, 1)
stringToByte = stringToByte & chrB(AscB(tempChar))
Next
End Function

Private Function byteToString(toConv)
For i = 1 to LenB(toConv)
byteToString = byteToString & Chr(AscB(MidB(toConv,i,1)))
Next
End Function

Response.Buffer = True

‘ load object
Dim load
Set load = new Loader

load.initialize

‘ *************************
‘ * Edit things from here *
‘ *************************

Dim fileName
fileName = LCase(load.getFileName(“Filedata”))
Dim pathToFile
pathToFile = Server.mapPath(“img/”) & “\”” & fileName
‘ Uploading file data
Dim fileUploaded
fileUploaded = load.saveToFile (“Filedata”, pathToFile)

‘ destroying load object
Set load = Nothing
%>
[/asp]
Em Cold Fusion
[code][/code]

Em C#.net
[csharp]string saveToFolder = “img”
private void Page_Load(object sender, System.EventArgs e)
{
HttpFileCollection uploadedFiles = Request.Files;
string Path = Server.MapPath(saveToFolder);
for(int i = 0 ; i < uploadedFiles.Count ; i++) { HttpPostedFile F = uploadedFiles[i]; if(uploadedFiles[i] != null && F.ContentLength > 0)
{
string newName = F.FileName.Substring(F.FileName.LastIndexOf(“\\”) + 1);
F.SaveAs(Path + “/” + newName);
}
}
}[/csharp]

42 thoughts on “Uploads de arquivos com o Flash 8”

  1. Cara, andei testando essa classe recentemente e me deparei com um probleminha: fazer um preview da foto a ser “uploadeada”. Lendo que você fez umas gambiarras, de repente consegues me dar uma “luz”. Acredito que o problema seja o seguinte: ao selecionar um arquivo, há uma propriedade interna da classe que guarda o nome do mesmo, mas não há uma que guarde o diretório onde se encontra a foto. Caso houvesse, seria simples mandar um loadmovie com o caminho completo (diretório + nome) da foto. Não havendo, preciso copiar a foto pra alguma pasta temporária, usando php, e dar o preview. Mas isto não é o ideal. Alguma idéia?

  2. Opa, cara, por acaso vc tem este exemplo usando asp ao invés de php?

    Obrigado

    Daniel

  3. Cara, valeu pelo tutorial, não conseguia achar nunca um que fizesse isso, e eu tava precisando..

    Será que vc não poderia me mandar o arquivo flash do tutorial.. obrigado, abraço!

  4. Mano, muito legal mesmo…mas por que é que ninguém ainda fez um tutorial desses usando ASP…se vc souber de algum…ou mesmo tiver agradeceria se me indicasse…valeu

  5. o Flash não pode acessar o sql diretamente, mas pode ser usado alguma linguagem de servidor como PHP ou Cold Fusion e mandar o resultado da consulta para o Flash

  6. e tambem quero sabe se tem como faze pra converte o video enquanto faiz o upload,como o youtube

  7. para fazer upload de videos basta adicionar a extensão do video na linha:
    imageFile.browse([{description:”Video Files”, extension:”*.avi;*.mpeg;*.mov;”}]);
    agora para converter video para o formato flv do flash é necessario um programa que faça isso no servidor como por exemplo o ffmpeg ou do proprio codec do flash 8 http://www.on2.com/

  8. então mais eu to curioso para saber como eu faria isso enquanto ele ta fazendo o upload,pois eu andei pesquisando e o youtube recebe o video em qualquer formato mais na hora de roda ele é redirecionado para um video flv.Se sabe como eu faria?

  9. Cara mau eu dei uma pesquisada eu ja achei é só depois de faze o upload usa o comando do php passthru
    que executa comandos unix ai usa o ffmpeg que voce disse pra passa do video para flv.=D mau te atrapalhado.

  10. Caro Leonardo estou precisando de uma actionscript(flash 8), seria o seguinte:

    O palco vai ficar assim:

    (Imagem) Logotipo AVG: Introdução (butão)
    network (butão)
    professional (butão)
    file serve (butão)

    Neste espaço em branco vai ficar a introdução do assunto que vou escolher. tipo: A informatica é o meio mais rapido e eficiente atualmente…………….
    ……………………………………………………………………………………………..
    ……………………………………………………………………………………………..

    Obs.: Assim que eu for clicar no butão network, butão profesional ou butão file serve, a caixa de texto vai informar o que cada um representa.

    Atenciosamente,

    Marcondes Filizola

  11. cara dexa eu te pergunta uma coisa
    a poco tempo fiz o upload roda
    só que me surgiu uma duvida os comandos de php pra controla tamanho e tipo de arquivo não vão funciona?
    abraços

  12. funcionam sim Julio, modificando um pouco o arquivo php para que não faça upload de arquivos maiores que 30 kb

    $size = ($_FILES[‘Filedata’][‘size’]/1024);
    if($size<30){
    //if the file is moved successfully
    if ( move_uploaded_file( $_FILES[‘Filedata’][‘tmp_name’] , $uploadfile ) ) {
    echo( ‘1 ‘ . $_FILES[‘Filedata’][‘name’]);
    //file failed to move
    }else{
    echo( ‘0’);
    }
    }else{
    echo( ‘0’);
    }

  13. Nilsson Fernandes

    Olá Leonardo … gostaria que vc me ajuda-se em algo, caso não seja abusar de mim parte !!! Existe a possibilidade dos arquivos do upload serem renomeados através de uma variavel vindo do flash ??? Tentei fazer alguns testes, mas não obtive sucesso 🙁 !!! Pelo sim ou pelo não agredeço desde já a ajuda … abs e sucesso !!!

  14. Caro Leonardo,

    Estou utilizando a classe FileReference para enviar arquivos para o meu site porém estou tendo problemas com o nome dos arquivos enviados. Quando existe acentos no nome do arquivo, como por exemplo a letra “ã” o Flash está substituindo por outro caracter. Já tentei colocar System.useCodepage=true no primeiro frame mas não deu certo.

    Grato

  15. Opa Muito bom Tutorial, Leonardo ou alguem, poderia me mandar também o arquivo .fla? Valew!

  16. Ola Leonardo,

    eu te enviei um email, sera que vc poderia me ajudar?

    Meu projeto de fim de semestre era pra fazer um
    web2.0 mas tentando fazer alguma coisa artistica….
    Entao aqui esta minha ideia, fazer um website onde as pessoas possam ir la e dar continuidade a minha historia atraves de videos…..
    tentando explicando melhor…..vou colocar um video de 15 segundos(por exemplo)
    comecando uma historia, e alguem vai la e colocar mais outro pedaco de
    video, dando continuidade na historia….e outra pessoa vai la e
    coloca mais um pedaco de video…..
    A ideia eh ao long do tempo ter uma sequencia de video soh, montada e
    criada por varias pessoas….
    Voce sabe se existe algum PHP code onde eu possa colocar no site pra
    fazer upload de video…..e algum modo para que assim que as pessoas
    fazem o upload do video delas, aquele novo pedacinho de video entram na
    sequencia do outro….Acho que talvez com flash eu consigo fazer isso certo…Play todos os Mini clips (videos) sendo um video soh

    sera que expliquei direito….por favor me avisa se vc pode me
    ajudar…serei muito grata e posso te explicar melhor se eu fui
    confusa…..

    Algumas pessoas falaram que atraves do Flash eu posso fazer os videos
    entrarem na sequencia e assistir como uma coisa so…….talvez usando
    actionsript…

    Nossa desculpas se estou falando bobagem…sou leiga total no
    assunto….mas prometo que vou me esforcar para entender….

    Aguardo ansiosamente sua resposta….
    Obrigada

  17. Ola Mari,
    é possivel fazer isso que vc quer sim, vejo duas possibilidade:
    voce pode deixar que o usuario grave um video no pc dele e deixar uma opçao no site para que ele faça o upload do video, o problema pode ser os varios formatos que os usuarios irão mandar, vc poder ter a limitaçao de espaço no seu provedor de hospedagem,

    outra opção é usar o Flash Media Server, e deixar que os usuarios gravem os videos pelo proprio site. os videos já serão gravados em um formato so, o FLV, vc tera mais controle sobre os arquivos gerados.

    para gerar uma sequencia, basta usar um script que quarde um banco de dados ou em um xml a sequencia dos arquivos.

    basicamente é esse o caminho 😉

    ate mais

    Leonardo França

  18. Olá, estou com problemas de tamanho de arquivo (preciso permitir arquivos de 10Mb ou um pouco mais. Via PHP obviamente pode dar timeout devido ao padrão das configurações do PHP e os servidores de hospedagem não liberarem para alterar.

    Esse script em FLash resolveria o meu problema???

    Obrigado!

  19. Mas o Flash não faz o “envio” do arquivo para o PHP após a conclusão do upload? Aí só se houver limitação do tamanho do arquivo, mas isso é menos provável. E qt a segurança do servidor, seja mais fácil contornar junto ao hospedeiro do que a questão do tempo de timeout.

    Obrigado desde já!

  20. Oi Leonardo,

    Muito Obrigada pela ajuda…
    Eh por ai mesmo minha ideia….Minha ideia eh dizer no site o formato que as pessoas devem fazer o upload ou seja, todo mundo faca o upload em AVI ou mpeg por exemplo….Dai nao tem problema de ter que ficar convertendo os arquivos para um formato unico uma vez que todo mundo fara upload num formato padrao…

    O que eu ainda nao sei fazer, e estou confusa e a parte de fazer uma janela para aparecer os videos na sequencia….Ou seja preciso fazer um “playing multiple video clips” um na sequencia do outro na ordem que eles forem sendo upload…

    o que seria : “para gerar uma sequencia, basta usar um script que quarde um banco de dados ou em um xml a sequencia dos arquivos.”???

    Mil desculpas pela ignorancia e nao saber o que faco entao….gerar um script eh relacionado ao flash???

    Muito Obrigada mais uma vez
    MARIANA

  21. Oi Leonardo,

    mais uma pergunta….(prometo que eh a ultima, hehe)
    Eu entendi sobre o PHP onde eu posso gerar o xml…O que eu preciso da sua ajuda eh com o flash e actionscritp…Teriamos um codigo para assistirmos a sequencia dos multiples videos….??? Um amigo ja esta me ajudando com o PHP, mas o que estamos presos aqui eh com a parte de como dar play na sequencia inteira….como fazer isso em flash?

    Obrigadissima
    Mariana

  22. Ola Mariana, o problema seria que nem todos os usuarios sabem salvar em determinado formato, eu recomendo que voce deixe que o servidor Flash Media Server criar os arquivos .flv
    no Claro ParkFashion fiz algo assim na parte em que os usuarios gravam seus depoimentos e para mostrar, fiz o swf carregar o xml com uma sequencia que criei por um script PHP, brevemente estarei disponibilizando os fontes, mas qualquer duvida, pode falar. ;o)

  23. Ola Gostaria que você me esclarecesse algumas duvidas
    Estou fazendo meu projeto final da facul
    E preciso fazer Upload de arquivos para coloca num album que vai ter no meu site
    baxei este FLA que você disponibilizou ai .. Ai testei no meu PC e não funciona e aparece esta mensagem => onIOError:
    Alguém pode me ajudar pelo amor de deus
    Sei pouco de flash estou aprendendo agora
    Alguém pode me explicar como faço pra Upload funcionar
    Agradeço a todos desde já

  24. E ai Leonardo blz?? Cara faz um tempão que estou procurando algo sobre upload de arquivos que funciona, consegui recriar o que você fez mas, quando vai concluir o upload do arquivo ele apresenta o seguinte trecho no textarea:
    to upload capa86.jpg
    Opening capa86.jpg
    onProgress with bytesLoaded: 28236
    bytesTotal: 28236
    onHTTPError: capa86.jpg

    Naõ consigo achar nada sobre esse erro.. poderia me ajudar???
    Desde já agradeço!!!!

    PS: Desculpe pela mancada na msg anterior, estou mandando a mesma dúvida para outros forúns e blogs

  25. qual mensagem de erro mostra exatamente? vc ta usando que linguagem de servidor, o diretorio onde serao enviados os arquivos possuem as permissoes de leitura e escrita?

  26. Olá Leonardo, depois de um tempinho sem meu pc, consegui voltar a esse projeto que estou desenvolvendo…Qto ao erro, ele só me diz que é um erro de HTTP, estou usando php, e o diretorio possue permissão de leitura e escrita…

    Aguardo, e desde já agradeço!!! Qualquer coisa me responde no email!!!

Leave a Reply

Scroll to Top