2008-10-15 8 views
8

J'essaie d'émuler le code de téléchargement de fichiers à partir du site Web de Grails, et je rencontre des problèmes. J'utilise le même code que celui trouvé here. Voici mon code:Grails Problèmes de téléchargement de fichiers

<g:form action="upload" method="post" enctype="multipart/form-data"> 
     <input type="file" name="myFile" /> 
     <input type="submit" value="Upload" /> 
    </g:form> 

et

def upload = { 
    def f = request.getFile('myFile') 
    if(!f.empty) { 
     flash.message = 'success' 
    }  
    else { 
     flash.message = 'file cannot be empty' 
    } 
} 

Je reçois l'erreur suivante lors de l'exécution:

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"} 

Il semble être lié à une configuration de printemps. Spring ne semble pas s'injecter MultipartHttpServletRequest, donc ma requête ne possède pas la méthode appropriée. Je viens de créer ces applications en utilisant grails create-app. Je n'ai pas modifié le fichier resources.groovy. J'utilise des grails 1.0.3.

Toute aide est très appréciée. Le site Web de grails rend ce regard si facile.

Répondre

12

Problème résolu!

J'utilisais l'exemple de code pour télécharger des fichiers sur Grails différemment de l'auteur original. Le problème est que lorsque la méthode upload du contrôleur a été appelée, c'était parfois pour le rendu original de la page Upload. La requête dans cette méthode n'était pas de type MultipartHttpServletRequest. Lorsque j'ai fait un POST avec mon fichier à télécharger, alors Spring a fait la bonne chose et a changé ma demande à MultipartHttpServletRequest. Donc, je devais faire une vérification simple dans ma mise à jour méthode du contrôleur avant d'utiliser ma demande comme un 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' 
+0

Oh, vous ... vous ne voulez jamais autoriser le POST et GET à partir de la même fermeture d'action, juste pour ce genre de chose. – billjamesdev

+0

Si quelqu'un cherche comment tester ceci, voici un bon lien http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ merci à Roshan – rsilva4

4

assurez-vous de mettre à jour le code HTML (votre gsp avec le formulaire à télécharger à partir) d'avoir le enctype comme ils montrent:

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

espoir qui est utile, semble trop évident, mais il est ma première pensée après avoir vu votre message d'erreur.

+0

Je l'ai mais ça ne marche toujours pas. J'ai ajouté mon code exact à mon post original ci-dessus. – anschoewe

+0

merci, voir votre mise à jour ... en essayant de creuser ... est-il wierd que la demande est spécifique à la jetée et pas seulement une demande Http ... – codeLes

+0

Certes, je suis nouveau à Grails. J'ai supposé depuis que j'utilisais mon application en utilisant Jetty, c'était normal pour la demande de par Jetty. – anschoewe

2

Quelqu'un here semble avoir les mêmes problèmes que vous aviez. Il dit qu'il l'a "réparé":

Résolu. C'était mon erreur, j'allais en action sauf avant de soumettre le formulaire, donc je suppose qu'il n'y avait pas de fichier.

Vous ne savez pas comment prendre ce qu'il a dit, mais peut-être que ça va vous aider.

+0

vu cela, mais n'avait aucune idée de la façon de le communiquer ... un autre gars dit qu'il a fait un nettoyage et vidé sa cache et ça a marché ... pas sûr de cela ...mais cela a fonctionné pour lui en quelque sorte – codeLes

+0

Je ne suis pas sûr de savoir comment je vais à l'action avant de soumettre. Est-ce possible? J'ai nettoyé mes applications (les grails sont propres), mais je ne sais pas comment nettoyer les caches. – anschoewe

4

Maintenant, avec l'utilisation Grails 2.x:

<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 } 
} 

Plus propre, plus simple.

Questions connexes