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.
- import flash.net.FileReference;
Criando um objeto ouvinte para usar os métodos onSelect, onOpen, onComplete, onHTTPError, onIOError, onSecurityError, onProgress.
- 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;
- };
Criando uma instância da classe FileReference
- var imageFile:FileReference = new FileReference();
Adicionando nossos ouvintes a instancia criada.
- imageFile.addListener(listener);
Criando o botão, o textarea e o loader dinamicamente, necessário que esses componentes estejam na biblioteca do filme.
- 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});
Repare que no metodo browse, podemos definir quais extensões serão permitidas para upload.
- imageFile.browse([{description:"Image Files", extension:"*.jpg;*.gif;*.png;"}]);
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
- < ?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');
- }?>
O Código completo em Action Script:
- 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});
*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
- 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
- %>
Em Cold Fusion
- <cffile action="upload" fileField="Filedata" destination="#ExpandPath ('img')#" nameConflict="makeUnique" />
Em C#.net
- 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);
- }
- }
- }
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?
Cara, talves dê pra fazer usando o SharedObject, não sei ao certo, vou fazer uns testes
Opa, cara, por acaso vc tem este exemplo usando asp ao invés de php?
Obrigado
Daniel
Cara, não sei nada de ASP, mas em teoria seria so adaptar o arquivo de upload para a versão em ASP
oiiii
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!
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
Vc tem ideia de como posso ligar o flash ao sql?
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
cara tem como usar esse tutorial pra upload de videos?
e tambem quero sabe se tem como faze pra converte o video enquanto faiz o upload,como o youtube
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/
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?
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.
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
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
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’);
}
esse tuturial é muito bom dá pra vc madar para mim o file em .fla???
syxdesign@gmail.com
Olá amigo, parabens pelo tutorial, poderia enviar o .fla em douglasks@gmail.com obrigado. Abração!
Tem como ao invez de ser imagem ser um arquivo .doc ou .pdf a ser puxado? (uplodeado) hehe!
Se tem, como seria?
[]’s
Ola Geison,
basta colocar essas extensões na linha
imageFile.browse([{description:”docs”, extension:”*.doc;*.pdf;”}]);
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 !!!
Acredito que sim, tente mandar via GET para o PHP
ate mais
Leonardo França
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
Você pode tratar isso no php trocando esses caracateres especias. O ideal para evitar confusão no servidor é colocar sem acentos ou espaços. 😉
Olá Leonardo, parabéns pelo tutorial.
Será que vc poderia me mandar o arquivo .fla
do tutorial.. obrigado, abraço!
Opa Muito bom Tutorial, Leonardo ou alguem, poderia me mandar também o arquivo .fla? Valew!
segue o fla pra quem pediu(desculpa a demora)
http://www.leonardofranca.com.br/fla/upload.fla
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
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
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!
Não resolveria porque o Flash mandará o arquivo para o script PHP e passaria por essa limitação do mesmo jeito. ;o)
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á!
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
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
Aragas, o Flash envia o arquivo para o PHP e este faz o upload propriamente dito
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)
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á
vc tem que usar também um arquivo no servidor(PHP, Cold Fusion etc), pois o swf vai interagir com ele.
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
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?
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!!!