Estou tentando fazer o upload de um arquivo com o seguintes códigos:
JSP:
<formid="form_upload"enctype="multipart/form-data"><ulclass="form_fields_container"><li><label>Imagem:</label><divclass="form_input"><inputtype="file"class="btn required"id="imagemUpload"name="imagem"/></div><ahref="#"onclick="$(this).closest('form').submit()"class="button_small bluishBtn fl_right"><spanclass="iconsweet">=</span>Gravar</a></li></ul></form>.....$("#form_upload").submit(function(event){vardata=newFormData();data.append('imagem',document.getElementById('imagemUpload'));$.ajax({type:"POST",processData:false,contentType:false,url:"/minha/url",data:data,success:function(jsonResposta){$.notify(jsonResposta.dsData,jsonResposta.tpMensagem);if(jsonResposta.tpMensagem=='success'){alert('Fez upload! '+jsonResposta.dsFuncionalidades);}else{alert('Alguma coisa nao deu certo!');}}});returnfalse;});
e na classe Controller:
@Post("/minha/url")publicvoidupload(finalUploadedFileimagem)throwsException{MensagemAjaxajax=newMensagemAjax();try{System.out.println(imagem.getContentType());// String nomeArquivo = "testeImagem";// imagens.salvarImagemDiretorio(imagem, nomeArquivo);ajax.setMensagemSucesso("Imagem incluida com sucesso");}catch(Exceptione){ajax.setMensagemErro("A imagem não pode ser salva ou o arquivo não é valido");}result2.use(json()).withoutRoot().from(ajax).serialize();}
A minha requisição chega na classe controller, mas o parâmetro ‘imagem’ vem sempre nulo. Imagino eu que a utilização da classe br.com.caelum.vraptor.interceptor.multipart.UploadedFile seja indevida para esse caso. Devo usar outra classe do VRaptor? Obter o arquivo do Request?
Isso que você está fazendo não funciona mesmo. Por isso nem chega a imagem no vraptor. Você não consegue fazer upload de arquivo apenas com $.ajax do jquery
vc pode fazer direto no submit do form, mas se não dá pra fazer dessa forma. há plugins que te ajudam como o uploadify ou o usando o Jquery File Upload
Estou tentando fazer o upload de um arquivo com o seguintes códigos:
JSP:
<formid="form_upload"enctype="multipart/form-data"><ulclass="form_fields_container"><li><label>Imagem:</label><divclass="form_input"><inputtype="file"class="btn required"id="imagemUpload"name="imagem"/></div><ahref="#"onclick="$(this).closest('form').submit()"class="button_small bluishBtn fl_right"><spanclass="iconsweet">=</span>Gravar</a></li></ul></form>.....$("#form_upload").submit(function(event){vardata=newFormData();data.append('imagem',document.getElementById('imagemUpload'));$.ajax({type:"POST",processData:false,contentType:false,url:"/minha/url",data:data,success:function(jsonResposta){$.notify(jsonResposta.dsData,jsonResposta.tpMensagem);if(jsonResposta.tpMensagem=='success'){alert('Fez upload! '+jsonResposta.dsFuncionalidades);}else{alert('Alguma coisa nao deu certo!');}}});returnfalse;});
e na classe Controller:
@Post("/minha/url")publicvoidupload(finalUploadedFileimagem)throwsException{MensagemAjaxajax=newMensagemAjax();try{System.out.println(imagem.getContentType());// String nomeArquivo = "testeImagem";// imagens.salvarImagemDiretorio(imagem, nomeArquivo);ajax.setMensagemSucesso("Imagem incluida com sucesso");}catch(Exceptione){ajax.setMensagemErro("A imagem não pode ser salva ou o arquivo não é valido");}result2.use(json()).withoutRoot().from(ajax).serialize();}
A minha requisição chega na classe controller, mas o parâmetro ‘imagem’ vem sempre nulo. Imagino eu que a utilização da classe br.com.caelum.vraptor.interceptor.multipart.UploadedFile seja indevida para esse caso. Devo usar outra classe do VRaptor? Obter o arquivo do Request?
Agradeço desde já.
Acho que a primeira coisa a verificar é se o VRaptor está configurado para tratar o upload de arquivos, no caso, isso é feito através da adição da dependencia do commons-fileupload.
Segunda, o upload diretamente com ajax, não ira funcionar sem o submit do form, nao tem como. A nao ser o uso de algum plugin adicional que faca o trabalho.
Felipe_Pinto_da_Silv
Boa noite kadu,
Tentei utilizar o exemplo que você me mandou. E em parte funcionou: o upload do arquivo está funcionando (alterei a assinatura do método para ‘public void upload(Collection files)’), mas a página está sendo submetida. Não quero submit, e quero mostrar uma mensagem depois que terminou o download. O meu código está assim (sem erro de javascript acusado pelo firebug):
Como faria para que a página não fosse submetida? Alguém poderia me ajudar?
Felipe_Pinto_da_Silv
Kadu, em um daqueles arquivos tinha o exemplo com o uploadify e resolvi testar.
Inicialmente o objeto UploadedFile vinha nulo na minha classe controller. Fuçando um pouco na interwebs eu descobri que o Uploadify força que o nome do parâmetro seja ‘Filedata’ então, a parada funfou. Friso que o Uploadify permite que tu possa selecionar vários arquivos, entretanto ele chama o método da classe controle para cada arquivo, por conta disto o método não recebe um Collection.
Sem submit, como se fosse ajax, do jeito que eu queria!! Vou postar aqui o código para que outros possam consultar! renanpto e kadu, obrigado pela resposta!