Anexos com vraptor e caminho relativo

Olá a todos

tenho um jsp onde envio um arquivo, botei o multipart e tudo certinho…

tenho uma controller onde recebo ele certinho:

String realPath = requestInfo.getServletContext().getRealPath( "/anexos"); File destino = new File(realPath, anexo.getFileName()); IOUtils.copyLarge(anexo.getFile(), new FileOutputStream(destino));

tenho um problema o jboss ta fazendo deploy em um temp… isso é normal O.o?
entao quando pego o caminho relativo me vem isso aqui “D:\programas\jboss-6.0.0.20100216-M2\server\default\tmp\5c4o52s-8it1h5-gd06q3me-1-gd06r4mh-9t\meuprojeto.war” ou seja se eu renicia o servidor eu perco meus anexos pq eles ficaram em outro tmp =/

link pra baixa o anexo ta assim:

se eu não me engano é normal ele fazer isso sim…

tenta fazer o deploy com uma pasta (o war deszipado) e vê se acontece a mesma coisa (acho que sim)

o ideal é vc configurar em algum lugar uma pasta física na máquina do servidor, e usar essa pasta

VALEU ajudo muito com essa dica de não gerar o .war, com a pasta funciona redondo.

mais uma coisa…

como faço pra carregar um input file?

tentei carrega usando

e tentei assim tbm…

onde no anexo vem somente nome do arquivo exemplo imagem.jpg

carregar?

o que vc quer fazer exatamente, mostrar o anexo na tela? a imagem?

[quote=Lucas Cavalcanti]carregar?

o que vc quer fazer exatamente, mostrar o anexo na tela? a imagem?[/quote]

Não não, quero que só aparece o caminho já ta bom… preciso se eu for alterar a tela e clicar em salvar ele não salve null, salve exatamente o que tinha antes…

e outra coisa que estranhei é que se ponho um arquivo maior que 2mb a minha controller recebe TODOS os parametros null, não somente o anexo, tem como muda isso?

geralmente não faz muito sentido preencher o input file no servidor… isso pq o caminho que vc coloca lá é o caminho na máquina do cliente, não no servidor… se eu não me engano o atributo value não funciona nesses inputs…

pra ele não salvar null, é só colocar o valor antigo no seu controller… o ideal é fazer algo assim:

public void altera(Entidade entidade, UploadedFile arquivo) {
     Entidade persistida = dao.load(entidade.getId());
     
     //validações

     //coloque abaixo só os atributos que vieram do formulario
     persistida.setAtributo1(entidade.getAtributo1());
     persistida.setAtributo2(entidade.getAtributo2());
     persistida.setAtributo3(entidade.getAtributo3());

     if (uploadedFile != null) {
         Arquivo a = //processa o arquivo
         persistida.setAtributo4(a);
     }
     //não precisa fazer o dao.merge ou coisa do tipo, já vai acontecer automático qdo vc comitar a transacao
}

hmmm beleza… vou tratar… e quando ao limite dos 2mb? é algo no vraptor? ou do input file mesmo?

é o vraptor que limita, mas dá pra configurar…

só criar uma classe anotada com @Component que implementa MultipartConfig…

o problema é que se os outros parâmetros da requisição vêm junto com o arquivo que vc tah fazendo upload… se o arquivo é muito grande, não tem mto como separar os outros parametros sem parsear esse arquivo…

o ideal é vc não misturar o upload com o resto do formulário… faça um form só pro upload, e outro pro resto dos atributos… se vc der uma olhada nos sites por aí, é assim que eles fazem

segue eu na briga dos upload… apareceu agora mais um porém…

-eu uso @put pra enviar meus formularios de alteração,

  • seguindo aquele meu exemplo que quando anexava algo além dos 2mb de tamanho, enviava todos parametros null (desta forma eu consegui tratar. @post), porém quando utilizo o @put da erro antes de chegar no meu método (somente quando passa dos 2mb)…

[code]HTTP Status 405 -

type Status report

message

description The specified HTTP method is not allowed for the requested resource ().
JBoss Web/3.0.0-beta-2[/code]

fazer um upload você tá acrescentando uma coisa no sistema (um arquivo) sem saber onde ele vai ser guardado… então o form de upload deveria ser POST…

qto ao form de edição (sem upload) PUT é mais legal mesmo =)

[quote=Lucas Cavalcanti]fazer um upload você tá acrescentando uma coisa no sistema (um arquivo) sem saber onde ele vai ser guardado… então o form de upload deveria ser POST…

qto ao form de edição (sem upload) PUT é mais legal mesmo =)[/quote]

mas com PUTda erro antes mesmo de chega no meu método se ele passar dos 2mb de anexo e assim fica inviavel de eu tratar…

sim, pq vc tah fazendo o put via _method, que eh um parâmetro do request… quando ultrapassa o tamanho do arquivo, não tem como recuperar os outros parâmetros do request, pq eles estão junto com o arquivo…

vc pode alterar o limite, fazer um request PUT de verdade (não sei se vai funcionar em todos os navegadores), ou separar o upload em outro form, com method=POST

da parte do VRaptor não sei se tem como a gente resolver isso, de qqer forma eu vou investigar…