Upload com vraptor3 + uploadify [resolvido]

Olá pessoal estou tendo problemas pra fazer upload con vraptor e uploadify. quando tento fazer o upload do arquivo ele me retorna um erro 404,ja testei o caminho do método direto no browser e esta ok.

segue mais informações:

o meu controller tem o seguinte metodo

    public void anexarArquivosAtividadeComplementar( UploadedFile files){
		
		 // manipula o arquivo
		
		
	}

no jsp tenho o seguinte javascript:


$(document).ready(
				       function(){
				    	   $('#files').uploadify({
				    			'uploader'       : '${pageContext.request.contextPath}/js/uploadify.swf',
				    			'script'         : '${pageContext.request.contextPath}/solicitacao/anexarArquivosAtividadeComplementar',
				    			'cancelImg'      : '${pageContext.request.contextPath}/img/cancel.png',
				    			'folder'         : '/tmp',
				    			'multi'          : true,
				    			'buttonText'	 : 'Adicionar arquivo',
						    	'queueSizeLimit' : 5 ,
						    	'sizeLimit'      : 2048000,
						    	'fileExt'        : '*.jpg;*.pdf;', 
						    	'onError'        : function(event, queueID, fileObj, errorObj){
							    	              alert(errorObj.info);

							    	} 
							    	
					    		
				    		});
					    }


				      );

outra dúvida é como fazer upload com múltiplos arquivos.

Agradeço desde já

o nome do parâmetro que o uploadfy passa é files?

vc tem que receber no seu controller um parâmetro com o mesmo nome que o uploadfy passa, senão não funciona…

qto ao upload de vários arquivos, ou vc recebe mais de um parâmetro na sua lógica, ou recebe uma List, ou ainda faz cada upload separadamente via ajax…

Olá Lucas, depois de muito quebrar a cabeça descobri o seguinte:
Tenho um interceptor quê verifíca um determinado parâmetro na sessão e caso não exista o parâmetro ele solta um erro 404, por alguma razão obscura quando o uplodify dispara o request, é como se o e request não fizesse parte da sessão atual do browser, então o meu interceptor não acha o parâmetro da sessão e soçta um erro 404.
Outra curiosidade é que isso só acontece no firefox, no ie funciona tranqüilo, vou ver o que faço aqui pra resolver.

Obrigado pela força.

sua sessão está sendo feita por cookies?

pode ser que o uploadfy não está mandando os cookies…

Obrigado pela dica lucas, consultando o oraculo descobri que problema todo é que o uploadify utiliza o flash pra fazer upload dos arquivos, dessa forma quando o request é disparado pelo flash ele é criada uma nova sessão no servidor.
Agora vai saber porque no ie esse compoortamento é diferente O_o.
Pra contornar vou passar um parametro, pra que ele identifique o request sem dar erro 404, qq coisa posto o resultado

[]'s

o que vc quer dizer por usar o flash?

Adobe Flash?
Flash Scope?

[quote=Lucas Cavalcanti]o que vc quer dizer por usar o flash?

Adobe Flash?
Flash Scope?[/quote]

Hehehe. Essa eu rí muito alto. Pelo que entendi no site ele usa Adobe Flash.

Muito provavelmente é uma implementação bem porca e que não consegue usar o jsessionid enviado pelo navegador.

Realmente era o Adobe Flash :slight_smile:

Agora tá funcionando que é uma beleza, obrigado a todos pela atenção

[]´s

[quote=cordjr]Realmente era o Adobe Flash :slight_smile:

Agora tá funcionando que é uma beleza, obrigado a todos pela atenção

[]´s[/quote]
Bom Dia,

Voce conseguiu fazer o upload de multiplos arquivos ? E como conseguiu acessar os arquivos no controller ?

Ontem estava tentando criar o upload de com esse plugin e não consegui.

O Vraptor não conseguia setar o parametro pro metodo da controller, sempre chegava nulll.

Pelos logs de debug do VRaptor ele recebia os arquivos e fazia o upload para a pasta temporaria do SO,

Uploaded file: fotos with [uploadedFile uploadedCompleteName=nomeDoArquivo.......]

Como pode ver o nome do campo no jsp é “fotos”…

No controller fiz varios testes desde com um unico arquivo ou multiplos.

Unico arquivo

public void salvar(UploadedFile fotos)

Multiplos arquivos…

public void salvar(List<UploadedFile> fotos)

Esse com multiplos arquivos acredito que não funcione sem fazer o tratamento para setar a posicao na Collection o qual o arquivo ira usar (ex: fotos[0]).

E como voce fez para resolver esse problema da aplicacao em flash criar um nova sessao ? Voce tratou no interceptor, tipo adicionando um novo parametro como flag ?
Para isso tentei passar o jsessionid no campo scriptData, mas não rolo. Sempre tava criando uma nova sessao FDP (rs).

Isso ai.

baixe o último snapshot do vraptor:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100519.161626-7.jar

e chame o input de fotos[]

teoricamente vai funcionar

Olá no meu caso eu precisava em vez de fazer upload de varios arquivos, usea uma funcionalidade do uploady que fazia upload dos arquivos a medida que eu ia selecionando, quando ao parametro, o uploadfy nomeia como “Filedata” então você vai ter que usar um método mais ou menos assim :

  public void anexar(UploadedFile Filedata){
      ...
  }

espero ter ajudado :slight_smile:

[]´s

[quote=Lucas Cavalcanti]baixe o último snapshot do vraptor:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100519.161626-7.jar

e chame o input de fotos[]

teoricamente vai funcionar[/quote]
Até funcionou, agora está chegando somente um unico arquivo na colecao.

Teste essas variaveis no parametro do metodo UploadedFile[] fotos ou List fotos.

Pelo log do Vraptor ele recebeu os 3 arquivos que selecionei.

DEBUG MultipartInterceptor - Found [3] attributes in the multipart form submission. Parsing them.
DEBUG VRaptorRequest - Setting fotos[] with [1967 GT 500 Shelby Mustang 2.jpg]
DEBUG MultipartItemsProcessor - Uploaded file: fotos[] with [uploadedFile uploadedCompleteName=1967 GT 500 Shelby Mustang 2.jpg uploadedName=1967 GT 500 Shelby Mustang 2.jpg contentType=image/jpeg]
DEBUG VRaptorRequest - Setting fotos[] with [42230.jpg]
DEBUG MultipartItemsProcessor - Uploaded file: fotos[] with [uploadedFile uploadedCompleteName=42230.jpg uploadedName=42230.jpg contentType=image/jpeg]
DEBUG VRaptorRequest - Setting fotos[] with [45.JPG]
DEBUG MultipartItemsProcessor - Uploaded file: fotos[] with [uploadedFile uploadedCompleteName=45.JPG uploadedName=45.JPG contentType=image/jpeg]

[quote=cordjr]Olá no meu caso eu precisava em vez de fazer upload de varios arquivos, usea uma funcionalidade do uploady que fazia upload dos arquivos a medida que eu ia selecionando, quando ao parametro, o uploadfy nomeia como “Filedata” então você vai ter que usar um método mais ou menos assim :

  public void anexar(UploadedFile Filedata){
      ...
  }

espero ter ajudado :slight_smile:

[]´s[/quote]
Sim, eu alterei o nome do campo através do pelo atributo “fileDataName” do uploadify.
E a questão da aplicacao flash criar uma nova sessão pro upload, qual foi a solucão que encontrou ?

No caso fis assim :
1 adicionei uma parâmetro no scriptData com id da sessão.

    'scriptData'     :   'sessionId': '${pageContext.request.session.id}'

2 em seguida, no meu metodo do controller, adicionaei esse parametro para que quando o arquivo fosse upado seria gravado num diretorio onde o nome do arquivo seria o nome original + o id da sessao, dessa forma, quando precisava jogar os arquivos no destino final era só procurar os arquivos que contivessem o id da sessão no nome.

    public void anexar(UploadedFile FileData, String sessionId){
         gravaArquivoTemporario(FileData, sessionId);
    }

[]'s
Não ficou muito elegante mais tá funcionando :).

[quote=cordjr]No caso fis assim :
1 adicionei uma parâmetro no scriptData com id da sessão.

    'scriptData'     :   'sessionId': '${pageContext.request.session.id}'

2 em seguida, no meu metodo do controller, adicionaei esse parametro para que quando o arquivo fosse upado seria gravado num diretorio onde o nome do arquivo seria o nome original + o id da sessao, dessa forma, quando precisava jogar os arquivos no destino final era só procurar os arquivos que contivessem o id da sessão no nome.

    public void anexar(UploadedFile FileData, String sessionId){
         gravaArquivoTemporario(FileData, sessionId);
    }

[]'s
Não ficou muito elegante mais tá funcionando :).[/quote]

Se foi a unica maneira que encontrou fazer o que né :lol: .

Aqui o parametro setado no scriptData e o arquivo nao estao chegando no controller :? . (muito estranho)

Fiz dessa forma que sugeriu e nada, upar somente um arquivo por vez, iniciando o upload apos a selecao do arquivo e tal.

  public void anexar(UploadedFile FileData, String sessionId){
         ......
    }

Os js que voce utilizou foram só os que a documentacao indica ?

&lt;script type="text/javascript" src="/path/to/jquery-1.3.2.min.js"&gt;&lt;/script&gt; 
&lt;script type="text/javascript" src="/path/to/swfobject.js" 
&gt;&lt;script type="text/javascript" src="/path/to/jquery.uploadify.v2.1.0.min.js"&gt;&lt;/script&gt; 

Unica diferente nos scripts é que a versao do jquery que estou utilizando é a jquery-1.4.2.min.js.

No jsp, esse elemento “#files” que voce esta usando é um input do tipo file ?

Obrigado

Lucas, os testes que fiz apos a atualizacao do jar do vraptor estou usando um outro plugin do jquery diferente do Uploadify, MultiFile http://fyneworks.com/jquery/multiple-file-upload/
Esse faz o submit via form, nao usando ajax. Como disse para fazer upload de varios arquivos o array/colecao chega apenas com um unico arquivo.
Caso nao use upload de multiplos arquivos tendo no metodo apenas o “UploadedFile foto” funciona sem problemas.

Ontem quando comecei com essa historia de fazer o uploads, iniciei utilizando o plugin “Uploadify”. E nao consegui fazer que os objetos chegassem no metodo da controller.
Como nosso amigo “cordjr” conseguiu fazer o plugin funcionar junto com o VRaptor, eu continuei tentando fazer funfar… “Eu sou brasileiro, não desisto nunca!” rs
Para desencargo de consciencia achando que eu estava usando errado o plugin, criei um projetinho a parte sem o VRaptor para realizar o teste. Criei um Servlet para atender as requisições, ficando assim:

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 System.out.println("UploadServlet invoked. Here are all uploaded files: ");
	        try {
	            List&lt;FileItem&gt; items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
	            for (FileItem item : items) {
	                if (!item.isFormField()) {
	                    System.out.println("Name: " + item.getName());
	                    System.out.println("Size: " + item.getSize());
	                    System.out.println("Type: " + item.getContentType());
	                }
	            }
	        } catch (Exception e) {
	            throw new ServletException(e);
	        }
	}

Originalmente retirado daqui http://stackoverflow.com/questions/2272160/uploadify-plugin-doesnt-call-java-servlet
Fiz o teste e o arquivos chegaram no servlet corretamente.
Usando este plugin parece que os arquivos sao upados pelo VRaptor, segundo o log:

DEBUG VRaptorRequest - Setting Filedata with [P1160327.JPG] DEBUG MultipartItemsProcessor - Uploaded file: Filedata with [uploadedFile uploadedCompleteName=P1160327.JPG uploadedName=P1160327.JPG contentType=application/octet-stream]
E no metodo da controler ta esperando o “UploadedFile Filedata”… e nao chega nada…

Obrigado.

renanpto realmente está muito estranho isso… :shock: não sei se isso ajuda mais a versão do vraptor homolaga aqui é a 3.0.2
e está funcionando perfeitamente. os javascripts são aqueles que vc citou. Outra coisa vc já tentou injetar um httpServletRequest e verificarse os parametros estão realmente lá ?

não tem um jeito de vc especificar o nome dos parâmetros no uploadfy?

Sim, tem.
Como voce pode ver no log do VRaptor o nome do parametro para o metodo é “Filedata”.

DEBUG VRaptorRequest - Setting Filedata with [P1160327.JPG]  
DEBUG MultipartItemsProcessor - Uploaded file: Filedata with [uploadedFile uploadedCompleteName=P1160327.JPG uploadedName=P1160327.JPG contentType=application/octet-stream] 

Metodo da minha controller :

public void metodo(UploadedFile Filedata) {
....
}

então, renanpto, o problema aqui é que ele quer fazer o upload de vários arquivos ao mesmo tempo… e isso não tá rolando…

o que dá pra fazer tb é fazer os uploads um por um (do mesmo jeito que o orkut faz pra adicionar fotos, por exemplo)…