Проблемы с загрузкой файлов Grails
-
03-07-2019 - |
Вопрос
Я пытаюсь эмулировать код загрузки файлов с веб-сайта 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">
Надеюсь, это будет полезно, хотя это кажется слишком очевидным, но это моя первая мысль после просмотра вашего сообщения об ошибке.
Кто-то здесь кажется, у него те же проблемы, что и у тебя.Он говорит, что «исправил» это:
Решено.Это была моя ошибка: я начал действовать, прежде чем отправить форму, так что, полагаю, файла не было.
Не знаю, как воспринять то, что он сказал, но, возможно, это вам поможет.