Причина сообщения об ошибке
Проблема с вашим кодом в том, что вы приводите объект запроса к неправильному классу. Это часть сообщения об ошибке, которое говорит вам следующее:
Невозможно привести объект 'org.apache.catalina.core.ApplicationHttpRequest@19f46c5d' с классом 'org.apache.catalina.core.ApplicationHttpRequest' к классу 'org.springframework.web.multipart.MultipartHttpServletqu
Итак, у вас есть org.apache.catalina.core.ApplicationHttpRequest
, и вы пытаетесь привести его к org.springframework.web.multipart.MultipartHttpServletRequest
, что невозможно сделать.
Прелесть groovy (на котором написано grails) заключается в том, что он динамически печатается. Так что большая часть этого кастинга в любом случае избыточна!
Попробуйте заменить эти две строки
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile uploadedFile = (CommonsMultipartFile)mpr.getFile("myFile");
С этим:
def uploadedFile = request.getFile( "myFile" )
Но это не решит вашу проблему! Это просто изменит сообщение об ошибке, которое вы получите: '(
Корневой источник проблемы, и как мы получили неправильный класс запросов?
Подумав, почему у вас неправильный тип запроса для приведения, вы, возможно, забыли включить enctype="multipart/form-data"
в действие формы. Вероятно, это должно выглядеть примерно так:
<g:form action="save" method="post" enctype="multipart/form-data"> ... </g:form>
Простое изменение может решить вашу проблему, но я бы тоже удалил кастинг.
Обновление: реальный (?) Ответ
В HTML (а GSP используются для создания HTML) у вас не может быть вложенных форм. Одна форма не может быть внутри другой. Ваш GSP имеет две формы, первая выглядит так:
<g:form action="save">
Второй (внутри) выглядит так
<g:form action="save" enctype="multipart/form-data">
Так что вам нужно полностью избавиться от внутренней и убедиться, что внешняя (единственная оставшаяся) выглядит следующим образом:
<g:form action="save" method="post" enctype="multipart/form-data">