Upload e edição de Arquivo
26/02/2016 11:03
0
Oi pessoal,

tenho uma funcionalidade que armazena um arquivo pdf no banco de dados, e outra que altera o arquivo (remove o antigo e salva o novo).

Porém estou com dois problemas:
1- Na tela de edição, ao submeter o novo arquivo selecionado, o arquivo não é alterado. Na verdade ele sempre chega no Controller como sendo o arquivo anterior, como se nunca tivesse sido alterado no request.
2- Na tela de cadastro, ao submeter sem selecionar nenhum arquivo, ele armazena um arquivo de 0 bytes.

Tela (Cadastro e edição):

?<g:uploadForm action="save">
<label for='dataRealizacao'>Data de Realização *</label>
<g:datePicker name="dataRealizacao" precision="day" value="${new Date()}" relativeYears="[-5..10]"/>

?<label for='arquivo'>Arquivo *</label>
<input type="file" name="arquivo" accept="application/pdf" id="arquivo" />

?<fieldset class="buttons">
<g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
</fieldset>
</g:uploadForm>

Entidade:

class Entidade {
Date dataRealizacao
byte[] arquivo
static hasMany = [servicos : Servico]
static belongsTo = Servico
static constraints = {
arquivo nullable:true, maxSize: 1073741824 
dataRealizacao nullable: false, unique: true
}
static mapping = {
version false
}
String toString() {
dataRealizacao
}
}?


Nada foi alterado no Controller, continua o mesmo do scaffold.

Alguém tem alguma dica?
Tags: Grails uploadFile arquivo update


0
Olá Victor,
  Para resolver seu problema 2 (arquivo de 0 bytes) basta adicionar um "if" verificando o tamanho do arquivo, se não for maior que 0 vc não salva.
29/02/2016 11:21


0
Eu acho que o problema 2 está associado há sua tag <input type="file" (...) /> não ter o parâmetro "value" pegando o valor atual do objeto sendo editado.

<input type="file" name="arquivo" accept="application/pdf" id="arquivo" value="${entidadeInstance.arquivo}" />


Agora o seu problema n1 eu não faço ideia...
02/03/2016 15:30


0
A dica do "value" na tag input não fez nenhuma diferença.
Para o problema 2, realmente vou fazer alguma validação para ver se algum arquivo selecionado antes de salvar.
Agora o problema 1, da edição, eu consegui resolver mesmo não entendendo o motivo do problema.

Inseri o seguinte no controller:

if(request.getPart('arquivo').getSize() > 0){
entidade.arquivo = IOUtils.copyToByteArray(request.getPart('arquivo').getInputStream())
}?

Assim ele realmente atualiza o arquivo quando o mesmo é alterado na tela. Caso contrário ele mantém o arquivo que existia antes, por algum motivo.

OBS: Tive que usar o "getPart" pois pelo que eu entendi, na versão 3.0 do Servlet (que o Grails 3 usa) não se utiliza mais o "getFile".
OBS2: IOUtils = grails.io.IOUtils

Se alguém quiser complementar a solução, manda ai.



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