Spring MVC с загрузкой файлов ajax и MultipartFile - PullRequest
2 голосов
/ 30 августа 2011

У меня проблема с загрузкой Ajax с Spring 3 MVC.Я понимаю, что мне нужно настроить bean-компонент multipartResolver в весеннем конфиге, что я и сделал.Чем у меня может быть контроллер, подобный этому

@RequestMapping(value ="/settingsSim")
@ResponseBody
public Map uploadSimSettings(@RequestParam(value="qqfile", required=true) MultipartFile settings) {
 Map<String, Object> ret = new HashMap<String, Object>();
 return ret;
}

Проблема в том, что, когда я фактически отправляю запрос на сервер (фактически это делает загрузка с помощью файла Ajax, я получаю)отображается в журналах.Сейчас я действительно чешу голову, так как не могу понять, в чем проблема.

Ответы [ 5 ]

3 голосов
/ 04 июля 2012

мое решение:

@RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="multipart/form-data", produces="application/json")
@ResponseBody()
public String handleImageUpload(@RequestParam(value="qqfile", required=true) MultipartFile[] files, 
        @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException {

    if (files.length > 0) {
        filesSession.addAll(Arrays.asList(files));
        // store the bytes somewhere
        return  "{\"success\": true}";
    }
    else {
        return "{\"success\": false}";
    }
}

@RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="application/octet-stream", produces="application/json")
@ResponseBody()
public String handleImageUploadApplication(HttpServletRequest request, 
        @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException {

    if (request.getInputStream() != null) {
        // creamos el fichero temporal
        File file = File.createTempFile("file", "valumns",
                RepositoryData.getRepositoryData());
        FileOutputStream fos = new FileOutputStream(file);
        // copiamos contenido
        Streams.copy(request.getInputStream(), fos, true);
        //TODO: 
        //filesSession.addAll(Arrays.asList(files));
        // store the bytes somewhere
        return  "{\"success\": true}";
    }
    else {
        return  "{\"success\": true}";
    }
}

@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE)
public void handleException(Exception ex) {
    log.error("Ocurrio un error en el album", ex);
}
2 голосов
/ 16 ноября 2012

У меня была такая же проблема с Fineuploader (valums), и я попытался использовать request.getInputStream (), но не смог его запустить.

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

проблема с загрузкой Spring AJAX-файла

Как уже было сказано, я добавил конфигурацию компонента для многочастного преобразователя вмоя весенняя конфигурация

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

После этого я мог легко получить свой файл, используя

 public @ResponseBody Map ajaxUploadFile(@RequestParam MultipartFile qqfile) { ... }

Не забудьте добавить Apache commons-io.jar и библиотеки commons-fileupload.jar в вашем проекте, чтобы заставить его работать

1 голос
/ 14 июля 2012

По моим наблюдениям плагин загрузки файлов не отправляет многокомпонентный файл, а отправляет поток. Я мог бы заставить его работать, объявив метод контроллера для принятия имени файла в качестве параметра запроса qqfile и второго параметра в качестве httprequest. Затем я сделал дальнейшую обработку, используя request.getinputstream. Надеюсь, это поможет!

С уважением,

Прадйумна

1 голос
/ 05 мая 2012

При использовании плагина valums я решил эту проблему с помощью @RequestBody Spring annotation. Вы можете переписать свой код следующим образом:

@RequestMapping(value ="/settingsSim",method=RequestMethod.POST)
@ResponseBody
public Map uploadSimSettings(@RequestBody String body) {
 /*
 some controller logic 
 */
}

Обратите внимание, что переменная body будет содержать содержимое загруженного файла. Также в вашем примере нет объявления метода, что означает, что ваш метод будет сопоставлен с GET-запросом.

P.S. У меня также была эта проблема "нет многочастичной границы" при разборе запроса с Apache Commons. HttpServletRequest#getParts() возвращает просто пустую коллекцию.

1 голос
/ 08 сентября 2011

@ Томас Я столкнулся с той же проблемой при использовании того же плагина jquery.Пожалуйста, измените Content-Type в коде плагина на xhr.setRequestHeader («Content-Type», «multipart / form-data»);на моем плагине строка 1203, после этого теперь отображается трассировка стека, однако я столкнулся с другой проблемой, при которой печатаются журналы: 8 сентября 2011 г. 9:43:39Servlet.service () для диспетчера сервлетов вызвал исключение org.apache.commons.fileupload.FileUploadException: запрос был отклонен, так как не было найдено многочастной границы

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