[Flex+Java] Upload de Arquivo. Erro #2038 IO Error

21 respostas
silvano.pessoa

Alguem já conseguiu fazer Upload de arquivo usando Java + Adobe Flex tentei fazer esse exemplo abaixo mais sempre da o seguinte erro:
IO Error: [IOErrorEvent type=“ioError” bubbles=false cancelable=false eventPhase=2 text=“Error #2038”]

http://www.adobe.com/devnet/flex/articles/file_upload.html

21 Respostas

andre.gil

Silvano,

Você debugou o Java pra ver se tá dando algum erro nele?

[]s

kivia.silva

Estava com um problema parecido que corrigi aplicando o método POST ao invés do GET para o lado FLEX.

Exemplo:

public function enviar():void

{

if (this.fileRef == null) return;
var request:URLRequest = new URLRequest("http://localhost:8080/Projeto/swf/upload.jsp");
   
   request.method = URLRequestMethod.POST;
         
   try
   {
      fileRef.upload(request);
   }
   catch (error:Error)
   {
      txtPathFile.text = "Unable to upload file.";
   }

}

F

Silvano,
Tem um usando o BlazeDS q acho bem fácil. http://imasters.uol.com.br/artigo/13619/flash/realizando_download_e_upload_de_arquivos_com_blazeds/

[]s

J

Eu fiz umas mudanças ao configuraçãos,

JAVA

Sim, você está fazendo com Windows
em web.xml você tem que mudar o diretório (UploadDirectory)


UploadDirectory
C:/Users/javaph/Desktop/Guj/FileUpload/exec/

Eu mude tambem em web.xml
esta mudança assim que eu gosto “action.do

<servlet-mapping>
    <servlet-name>UploadHandler</servlet-name>
    <url-pattern>/uploadhandler.do</url-pattern>
</servlet-mapping>

depois

para testar do servlet Eu adiciono um método

public class UploadHandler extends HttpServlet {



public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException {

try {

response.getWriter().println(Listo);

} catch (IOException e) {

throw new ServletException(e);

}

}



}

NOTA : você exige “commons-fileupload-1.2.1.jar” em "WEB-INF/lib"
http://mirror.nyi.net/apache/commons/fileupload/binaries/commons-fileupload-1.2.1-bin.zip

http://localhost:9334/FileUpload/uploadhandler.do?test

quando eu obter “Listo” no browser estou listo pra Flex

FLEX

AGORA
É mais fácil se você tive FlexBuilder

no diretório "assets"
no arquivo “properties.xml”

Eu mudar para a nova URL


UploadHandler
http://localhost:9334/FileUpload/uploadhandler.do

E Tudo funciona!!!

marciofermino

Silvano vc conseguiu??

Estou com o mesmo problema;.;

Preciso realizar um upload em uma aplcacao Java Flex BlazeDS + Tom CAT

J

Em Qual OS ta trabalhando?

marciofermino:
Silvano vc conseguiu??

Estou com o mesmo problema;.;

Preciso realizar um upload em uma aplcacao Java Flex BlazeDS + Tom CAT

marciofermino

o tomcat remoto esta no Windows Server 2003

J

primeiro você precisa de permisos pra escrever

depois, eu fiz isso fazendo os cambios no web.xml e outros arquivos
slds

marciofermino

falei com o adm da rede ele me disse que deu as permissoes
e quanto ao web xml vc tem um exemplo
nao sei seria possivel ou pedir demais
vc poderia falar por skype ou msn?

J

nao pude adicionar-lhe, eu somente mudei o exemplo

marciofermino:
falei com o adm da rede ele me disse que deu as permissoes
e quanto ao web xml vc tem um exemplo
nao sei seria possivel ou pedir demais
vc poderia falar por skype ou msn?

Ivan_Alves

No começo o meu estava dando esse erro também porém, agora está funcionando de boa, no meu web.xml estava mapeando duas Servlet a MessageBrokerServlet(que o flex utiliza) e a minha FileUpload, ai estava ocorrendo um conflito já que minha MessageBrokerServlet tinha uma tag display-name eu removi apenas essa tag e ficou beleza. Tente ai talvéz seja isso também, qualquer coisa avisa aí!

horochovec

A forma mais fácil de fazer uploads sem sofrer é fazer o upload pelo flash player e serializar um objeto com o conteudo do arquivo em um ByteArray… Quando chegar no java, basta escrever o arquivo que veio serializado no objeto :wink:

Ivan_Alves

Uso o exemplo desse link para fazer upload
http://blog.digows.com/upload-de-arquivos-com-flex-php-e-java/
Qual seria essa outra forma? tem um exemplo?

horochovec

Bom, vou partir do exemplo que você tem um botão “Procurar” efetuou o clique nele:

Método para controle do click no botão de selecionar arquivos

protected function btnSelecionarImportacaoClickHandler(event:MouseEvent) : void
			{
				this.fileReference		= new FileReference();
				this.fileReference.browse();
				this.fileReference.addEventListener(Event.SELECT, 		selectHandler);
				this.fileReference.addEventListener(Event.COMPLETE, 		completeHandler);
				this.fileReference.addEventListener(IOErrorEvent.IO_ERROR,	ioErrorHandler);
			}

Carrega o arquivo na memoria

protected function selectHandler(event:Event) : void
			{
				this.fileReference.load();
			}

Evento de controle quando o player finaliza a leitura do arquivo para ser submetido ao servidor

protected function completeHandler(event:Event) : void
			{
				this.fileUploadVO			= new FileUploadVO();
				this.fileUploadVO.file			= new ByteArray();
				(event.currentTarget as FileReference).data.readBytes(this.fileUploadVO.file, 0, (event.currentTarget as FileReference).data.length);				
			}

Evento de controle quando ocorre uma violação ao arquivo que será enviado para leitura

protected function ioErrorHandler(event:IOErrorEvent) : void
			{
			}

Objeto que será enviado para o Java

package seu.pacote.flex.FileUploadVO
{
	import flash.utils.ByteArray;
	[Bindable]
	[RemoteClass(alias="seu.pacote.java.FileUploadVO")]
	public class FileUploadVO
	{
		public function FileUploadVO()
		{
		}
		public var file:ByteArray;
	}
}

Ai basta você enviar esse objeto para o java, como um RemoteObject normalmente, ao chegar lá… java básico, pegar o arquivo e escrever no servidor, ou guardar a informação no banco de dados

Ivan_Alves

Legal, esse exemplo usa servlet?? ou é só isso ai já funciona?

horochovec

Não usa servlet, apenas RemoteObject :wink:

marciofermino

ok mais vc tem exemplo:?

horochovec

Foi o que eu passei … A parte de RemoteObject é como você faz qualquer comunicação entre Flex e Java

xdraculax

#2038… errinho safado esse ai.

Melhor usar a solução proposta pelo companheiro de usar RemoteObject. Fazer upload para um servlet pode dar incompatilibilidade até com o proxy no Linux + Firefox.
Até hoje temos problema em uma aplicação aqui por conta disso.

horochovec

ehhehe

Realmente, esqueci de comentar sobre possíveis problemas com proxy, o que no RemoteObject não acontece, uma vez conectado no BlazeDS, WebORB, GraniteDS ou LiveCycle, vai funcionar com certeza.

Abraços

J

Meu caro boa tarde.

De vários exemplos que vi na net, esse foi bem mais fácil de se encaixar no que eu queria (apesar que ainda sou iniciante em programação).

Mas gostaria de uma ajuda com algumas coisas um tanto quanto bobas.

nos métodos carregaArquivo (que é o meu responsável por fazer essa chamativa), e nos selectHandler e completeHandler, estão todos com o erro:

E no método completeHandler, além do erro acima, esses:

Multiple markers at this line: -1120: Access of undefined property event. -1120: Access of undefined property event. -1119: Access of possibly undefined property fileUploadVO through a reference with static type

Esses métodos browse() e load(), eu preciso criá-los ou definir de alguma forma??

Aguardo.

Obrigado.

horochovec:
Bom, vou partir do exemplo que você tem um botão “Procurar” efetuou o clique nele:

Método para controle do click no botão de selecionar arquivos

protected function btnSelecionarImportacaoClickHandler(event:MouseEvent) : void
			{
				this.fileReference		= new FileReference();
				this.fileReference.browse();
				this.fileReference.addEventListener(Event.SELECT, 		selectHandler);
				this.fileReference.addEventListener(Event.COMPLETE, 		completeHandler);
				this.fileReference.addEventListener(IOErrorEvent.IO_ERROR,	ioErrorHandler);
			}

Carrega o arquivo na memoria

protected function selectHandler(event:Event) : void
			{
				this.fileReference.load();
			}

Evento de controle quando o player finaliza a leitura do arquivo para ser submetido ao servidor

protected function completeHandler(event:Event) : void
			{
				this.fileUploadVO			= new FileUploadVO();
				this.fileUploadVO.file			= new ByteArray();
				(event.currentTarget as FileReference).data.readBytes(this.fileUploadVO.file, 0, (event.currentTarget as FileReference).data.length);				
			}

Evento de controle quando ocorre uma violação ao arquivo que será enviado para leitura

protected function ioErrorHandler(event:IOErrorEvent) : void
			{
			}

Objeto que será enviado para o Java

package seu.pacote.flex.FileUploadVO
{
	import flash.utils.ByteArray;
	[Bindable]
	[RemoteClass(alias="seu.pacote.java.FileUploadVO")]
	public class FileUploadVO
	{
		public function FileUploadVO()
		{
		}
		public var file:ByteArray;
	}
}

Ai basta você enviar esse objeto para o java, como um RemoteObject normalmente, ao chegar lá… java básico, pegar o arquivo e escrever no servidor, ou guardar a informação no banco de dados

Criado 11 de março de 2010
Ultima resposta 19 de fev. de 2013
Respostas 21
Participantes 10