Grails de Upload de Arquivo Problemas
-
03-07-2019 - |
Pergunta
Eu estou tentando emular o código de upload de arquivos do site da grails, e eu estou correndo em alguns problemas. Estou usando o mesmo código que encontrou aqui . Aqui está o meu código:
<g:form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="submit" value="Upload" />
</g:form>
e
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
flash.message = 'success'
}
else {
flash.message = 'file cannot be empty'
}
}
Estou recebendo o seguinte erro em tempo de execução:
Message: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
Caused by: groovy.lang.MissingMethodException: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
Ele parece estar relacionada a alguma configuração do Spring. O Primavera não parecem estar injetando MultipartHttpServletRequest
, assim que meu pedido não tem o método apropriado. Acabei de criar este aplicações usando grails create-app
. Eu não modificou o arquivo resources.groovy. Estou usando grails 1.0.3.
Qualquer ajuda é muito apreciada. O site grails faz este olhar tão fácil.
Solução
Problema resolvido!
Eu estava usando o código de exemplo para upload de arquivos para Grails diferente do que o autor original provavelmente pretendia. O problema é que quando o Enviar método do controlador foi chamado, era, por vezes, para o original rendem de página Upload. O pedido nesse método era não era do tipo MultipartHttpServletRequest. Quando eu fiz um post com o meu arquivo para upload, em seguida, Primavera fez a coisa correta e mudou a minha requestion para MultipartHttpServletRequest. Então, eu precisava fazer uma verificação simples no meu Atualização método de controlador antes de usar o meu pedido como um MultipartHttpServletRequest.
if(request instanceof MultipartHttpServletRequest)
{
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile f = (CommonsMultipartFile) mpr.getFile("myFile");
if(!f.empty)
flash.message = 'success'
else
flash.message = 'file cannot be empty'
}
else
flash.message = 'request is not of type MultipartHttpServletRequest'
Outras dicas
Agora, com os Grails 2.x uso:
<g:uploadForm name="upload" action="upload" method="POST">
<input type="file" name="file" />
</g:uploadForm>
def upload = {
def file = request.getFile('file')
assert file instanceof CommonsMultipartFile
if(!file.empty){ //do something }
else { //do something }
}
Mais limpo, mais simples.
certifique-se de atualizar o html (o gsp com a forma de fazer upload de) para ter o enctype , pois mostram:
<g:form action="upload" method="post" enctype="multipart/form-data">
A esperança que é útil, parece muito óbvio, mas é meu primeiro pensamento depois de ver sua mensagem de erro.
aqui parece estar a ter os mesmos problemas que você teve. Ele diz que "fixo"-lo:
resolvido. Foi o meu erro, eu estava indo em ação salvar antes de enviar o formulário, então eu suponho que não havia nenhum arquivo.
Não sabe como tomar o que ele disse, mas talvez ele vai ajudá-lo.