2008-10-15 4 views
8

Я пытаюсь эмулировать код загрузки файла с веб-сайта grails, и у меня возникают некоторые проблемы. Я использую тот же код, что нашел here. Вот мой код:Проблемы с загрузкой файлов Grails

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

и

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

Я получаю следующее сообщение об ошибке во время выполнения:

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

Это, как представляется, связано с некоторой конфигурации Spring. Весна, кажется, не впрыскивает MultipartHttpServletRequest, поэтому мой запрос не имеет соответствующего метода. Я просто создал эти приложения, используя grails create-app. Я не изменил файл resources.groovy. Я использую grails 1.0.3.

Любая помощь очень ценится. Веб-сайт Grails делает это так просто.

ответ

12

Проблема решена!

Я использовал пример кода для загрузки файлов в Grails иначе, чем, вероятно, предполагал оригинальный автор. Проблема в том, что когда был вызван метод контроллера контроллера, он иногда использовался для исходного рендеринга страницы загрузки. Запрос в этом методе был не типа MultipartHttpServletRequest. Когда я сделал POST с моим файлом для загрузки, то Spring сделал правильную вещь и изменил мое обращение к MultipartHttpServletRequest. Таким образом, перед использованием моего запроса, например 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' 
4

убедитесь, что вы обновить HTML (ваш GSP с формой для загрузки с) иметь ENCTYPE как они показывают:

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

Надеется, что это полезно, кажется слишком очевидным, но это моя первой мысль после просмотра вашего сообщения об ошибке.

+0

У меня есть это, но он все еще не работает. Я добавил свой точный код к моему первоначальному сообщению выше. – anschoewe 2008-10-15 20:24:48

+0

спасибо, см. Ваше обновление ... пытаюсь выкопать ... это странно, что запрос является специфичным для Jetty, а не только HttpRequest ... – codeLes 2008-10-15 20:27:02

+0

По общему признанию, я новичок в Grails. Я предполагал, что, когда я запускал свое приложение с помощью Jetty, это было нормально для запроса типа Jetty. – anschoewe 2008-10-15 20:43:27

2

У кого-то here, кажется, есть те же проблемы, что и у вас. Он говорит, что он «исправил» это:

Решено. Это была моя ошибка, я продолжал действовать, прежде чем отправлять форму, поэтому, я полагаю, нет файла.

Не знаете, как взять то, что он сказал, но, возможно, это поможет вам.

4

Теперь с помощью 2.x Grails:

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

Более чистый, более простой.

Смежные вопросы