Проблемы с загрузкой файлов Grails - PullRequest
8 голосов
/ 16 октября 2008

Я пытаюсь эмулировать код загрузки файла с сайта 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. Spring не вводит MultipartHttpServletRequest, поэтому в моем запросе нет подходящего метода. Я только что создал это приложение, используя grails create-app. Я не изменил файл resources.groovy. Я использую Grails 1.0.3.

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

Ответы [ 4 ]

12 голосов
/ 16 октября 2008

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

Я использовал пример кода для загрузки файлов в Grails иначе, чем предполагал первоначальный автор. Проблема в том, что когда вызывался метод контроллера upload , он иногда использовался для оригинального рендеринга страницы Upload. Запрос в этом методе не был типа MultipartHttpServletRequest. Когда я сделал POST с моим файлом для загрузки, тогда Spring сделал правильную вещь и изменил мой запрос на MultipartHttpServletRequest. Итак, мне нужно было сделать простую проверку в моем методе контроллера update , прежде чем использовать мой запрос, например 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'
5 голосов
/ 14 июня 2013

Теперь с использованием 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 }
}

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

4 голосов
/ 16 октября 2008

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

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

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

2 голосов
/ 16 октября 2008

Кто-то здесь , похоже, испытывает те же проблемы, что и у вас. Он говорит, что «исправил» это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...