Вопрос

Я пытаюсь эмулировать код загрузки файлов с веб-сайта 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 это выглядит так просто.

Это было полезно?

Решение

Задача решена!

Я использовал пример кода для загрузки файлов в 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'

Другие советы

Теперь с 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 }
}

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top