Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Criando uma List de UploadedFile

Olá, Eu estou tentando criar uma List no vraptor, o código na minha jsp está assim:

<input type="file" id="upload_foto" name="imagens[]" multiple="multiple" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

e no meu controller está assim como

List<UploadedFile> imagens

mas quando mando print ele consegue percorrer a lista mas o valor é null do print

for (UploadedFile uploadedFile : imagens) {
            System.out.println(uploadedFile);
            //System.out.println(uploadedFile.getFileName());
        }

O que eu posso fazer? Obrigado!

8 respostas

Oi Henrique, tudo bem?

Tenta passar o índice no name (name="imagens[0]")?

Exemplo:

<input type="file" id="upload_foto" name="imagens[0]" multiple="multiple" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

Eu não cheguei a testar, mas se não me engano é assim que o VRaptor consegue preencher a lista.

Por favor avisa pra gente se funcionou ou não. :)

Abs.

Sim eu sei eu já tentei isso da na mesma :/ O erro é: "HTTP Status 500 - java.lang.IllegalStateException: There are validation errors and you forgot to specify where to go. Please add in your method something like:" e aqui está a modificacao que eu fiz em jquery

<script>
var contador_fotos = 0;
$("#upload_foto").on("change", function mudar_foto()
{
    /*
    var input = document.createElement("input");
    input.name = "imagens["+contador_fotos+"]";
    input.type = "file";
    input.value = $('#upload_foto').val();
    document.getElementById("resto").appendChild(input);
    */
    var clonador = $("#upload_foto");
    var clonado = clonador.clone(true);
    clonado.attr('name', "imagens["+contador_fotos+"]");
    clonado.attr('id', "imagens["+contador_fotos+"]_id");
    clonado.insertAfter($("#resto"));
    clonado.hide();
    contador_fotos++;
    adicionar_na_lista = $('#upload_foto').val("");
});
</script>

E na Jsp

<input type="file" id="upload_foto" name="imagem" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

Opa Henrique, mas no caso esse erro:

"There are validation errors and you forgot to specify where to go"

é relacionado as validações. Você está utilizando alguma validação no modelo?

Será que você pode compartilhar o seu código para eu dar uma olhada? O email é: lfelixsampaio@gmail.com

Abraço.

Na verdade é pq eu não coloquei nada no controller eu não coloquei um result.nothing() aqui está o código do controller:

@Post("/Cadastrar/Venda/")
    public void cadastrar(ClienteVenda cliente, List<UploadedFile> imagens,
            List<String> produtos, List<String> servicos, List<String> quantidade)
    {
        System.out.println(cliente.getAtendente_id());
        System.out.println(cliente.getId());
        System.out.println(cliente.getHorario());
        System.out.println(cliente.getDesconto());
        System.out.println(cliente.getValor_desconto());
        System.out.println(cliente.getMotivo_visita());
        System.out.println(cliente.getForma_pagamento());
        System.out.println(cliente.getAtivo());
        for (int i = 0; i < produtos.size(); i++) {
            System.out.println(produtos.get(i));
            System.out.println(quantidade.get(i));
        }
        for (String i : servicos) {
            System.out.println(i);
        }    
        for (UploadedFile uploadedFile : imagens) {
            System.out.println(uploadedFile);
            //System.out.println(uploadedFile.getFileName());
        }
    }

E aqui está a saída: Os dois ultimos "null" é do "System.out.println(uploadedFile);"

3
3
14/10/2015 10:52
porcentagem
null
S/M
dinheiro
sim
1
18
1
null
null

Eu percebi que ele reconhece o tamanho do vetor imagens porque eu dei upload em 2 imagens mesmo, mas não entendo pq o valor da null.

Oi Henrique, no comentário anterior, quando você disse:

"Sim eu sei eu já tentei isso da na mesma :/ O erro é: "HTTP Status 500 - java.lang.IllegalStateException: There are validation errors and you forgot to specify where to go. Please add in your method something like:" e aqui está a modificacao que eu fiz em jquery"

E falou que o código da jsp estava:

<input type="file" id="upload_foto" name="imagem" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

E se você fizer assim:

<input type="file" id="upload_foto" name="imagens[0]" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

<input type="file" id="upload_foto2" name="imagens[1]" size="50"
        class="btn" value=
        "<c:url value="/resources/imagens/Desconhecido.png"/>"/>

Porque é como te falei, o erro que você descreveu é relacionado a validação do domínio.

Para o VRaptor reconhecer que você quer preencher a lista, acredito que tem que por os índices: http://www.wbotelhos.com/manipulando-listas-com-jquery-e-vraptor-3

Pode tentar novamente? Aguardo retorno! :)

Abraço.

solução!

Consegui Resolver o problema! Obrigado Lucas Felix por responder. Vou colocar aqui a resolução caso outras pessoas passem pelo mesmo: 1º - Eu tinha esquecido que no form, quando se trata de upload de imagens é necessário colocar:

enctype="multipart/form-data" role="form"

2º - No controller é nescessário tratar como uma Array e não como uma List (Não sei pq), além de colocar a anotação de @UploadSizeLimit, pois como padrão o vraptor adota 2MB

UploadedFile[] imagem
    @UploadSizeLimit(sizeLimit=40 * 1024 * 1024, fileSizeLimit=10 * 1024 * 1024)

3º - o input file deve ficar mais ou menos assim: ```````````````````````````````````````````````

`````````````````````````````````````````````` Obrigado a todos pela atenção e em especial pelo Lucas Felix!

Oi Henrique, muito bacana! Que bom que funcionou!

Obrigado por compartilhar a solução.

Abraço.