Validar upload de arquivos com Command Object
08/06/2012 20:33
0
Pessoal,

Tenho o seguinte código na minha view:

<g:form method="post" enctype="multipart/form-data">

<label for="fileUpload">Selecione o local do arquivo:</label>
<input class="input-file" name="fileUpload" id="fileUpload" type="file">

<span class="update">
<g:actionSubmit value="Upload" />
</span>

</g:form>

E no meu controlador queria validar as informações de upload dos arquivos .txt usando CommandObjects, já que não tenho um domain criado (serão salvos no diretório da aplicação).

class UploadArquivoController {

def index (){}
}

class UploadArquivoCommand {

MultipartFile fileUpload

static constraints = {
fileUpload blank: false, nullable: false
}

}

Apenas queria verificar se foi feito o upload de algum arquivo e, posteriormente, validar se a extensão do mesmo é a correta. Mas ao submeter o formulário, não funciona.
Consegui implementar com sucesso várias lógicas de validação utilizando a classe Command com atributos String. Mas com a classe MultipartFile não funciona. O que estou fazendo de errado?

Muito obrigado!
Tags: file upload, MultipartFile, constraints, upload de arquivo, Command


1
Olá, Ronaldo.

Amigo, uma dica: Para evitar o "enctype" num formulário de upload, pode-se usar a tag
<g:uploadForm>

É como a <g:form> mas já com post como padrão e com o enctype de upload.


1
Bem, quanto a sua dúvida:

class UploadArquivoController {

def index() {
render(view:"vai")
}


def vai(UploadArquivoCommand uc) {
// o campo "arquivo" já vai vir preenchido porque está como parâmetro! Só o contentType que não sei como faz pra ser também :(
uc.tipo=request.getFile('arquivo').contentType
uc.validate()
[uc:uc] // na view pode ser algo como <g:renderErrors bean="${uc}" as="list" />
}
}

class UploadArquivoCommand {
byte[] arquivo
String arquivoType

static constraints = {
arquivo(nullable:false)
arquivoType(blank:false, inList:['image/jpeg','image/gif','image/png'])
}
}


Isso ai pra mim funcionou perfeito. Dai você pode customizar a mensagem de validação do campo de tipo ;)


1
Ah, retificando (mudei uns nomes e esqueci de atualizar tudo), o correto seria:

Classe Controller:
class UploadArquivoController {

def index() {
render(view:"vai")
}


def vai(UploadArquivoCommand uc) {
// o campo "arquivo" já vai vir preenchido porque está como parâmetro! Só o contentType que não sei como faz pra ser também :(
uc.tipo=request.getFile('arquivo').contentType
uc.validate()
[uc:uc] // na view pode ser algo como <g:renderErrors bean="${uc}" as="list" />
}
}

class UploadArquivoCommand {
byte[] arquivo
String tipo

static constraints = {
arquivo(nullable:false)
tipo(blank:false, inList:['image/jpeg','image/gif','image/png'])
}
}



GSP:
vai.gsp
<g:renderErrors bean="${uc}" as="list" />

<g:uploadForm action="vai">
<g:field type="file" name="arquivo"/>
<g:submitButton name="s" value="Vai!"/>
</g:uploadForm>


0
Muito obrigado, Yoshiriro! Funcionou perfeitamente!

Você ajuda sempre muito o pessoal por aqui!

Apenas alterei a instrução das constraints para aceitar apenas arquivos textos e .zip:

static constraints = {
tipo (blank: false, inList:['text/plain', 'application/octet-stream'])
}


:-)
09/06/2012 19:27



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto