Grails Datei-Upload-Probleme
-
03-07-2019 - |
Frage
Ich versuche, den Datei-Upload-Code von der Grails Website zu emulieren, und ich bin in einige Probleme laufen. Ich verwende den gleichen Code wie gefunden hier . Hier ist mein Code:
<g:form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="submit" value="Upload" />
</g:form>
und
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
flash.message = 'success'
}
else {
flash.message = 'file cannot be empty'
}
}
ich die folgende Fehlermeldung zur Laufzeit empfangen:
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"}
Es scheint zu einem gewissen Spring-Konfiguration zusammenhängen. Frühling erscheint nicht MultipartHttpServletRequest
zu injizieren, so dass meine Anfrage nicht über die geeignete Methode. Ich habe gerade diese Anwendungen mit grails create-app
. Ich habe nicht die resources.groovy Datei geändert. Ich bin mit Grails 1.0.3.
Jede Hilfe ist sehr geschätzt. Die grails Website macht dies so einfach aussehen.
Lösung
Problem gelöst!
Ich war mit dem Beispiel-Code für Dateien auf Grails anders als der ursprüngliche Autor wahrscheinlich gedacht hochladen. Das Problem ist, dass, wenn die Hochladen Methode des Controllers genannt wurde, ist es manchmal für das Original war übertragen von der Upload-Seite. Die Anfrage bei diesem Verfahren war, war nicht vom Typ MultipartHttpServletRequest. Wenn ich eine POST mit meiner Datei tat hochladen, dann tat Frühling die richtige Sache und änderte meine requestion zu MultipartHttpServletRequest. Also, ich brauchte eine einfache Prüfung in meinem update Controller-Methode zu tun, bevor meine Anfrage wie ein MultipartHttpServletRequest verwendet wird.
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'
Andere Tipps
Jetzt mit der Grails 2.x Verwendung:
<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 }
}
Mehr sauber, einfacher.
sicherstellen, dass Sie die HTML (Ihre gsp mit dem Formular aus hochladen) aktualisieren Sie die enctype haben, da sie zeigen:
<g:form action="upload" method="post" enctype="multipart/form-data">
Hope, die hilfreich ist, scheint zu offensichtlich, aber es ist mein erster Gedanke nach der Fehlermeldung zu sehen.
hier scheint die gleichen Probleme zu haben Sie hatten. Er sagt, er „fest“ es:
Gelöst. Es war mein Fehler, ich war in Aktion gehen speichern, bevor Sie das Formular abschicken, so dass ich nehme an, es war keine Datei.
Nicht sicher, wie zu nehmen, was er sagte, aber vielleicht wird es Ihnen helfen.