Raw Spring 5 и Commons FileUpload не работают - PullRequest
0 голосов
/ 14 декабря 2018

Я выполняю рефакторинг некоторого устаревшего кода, используемого для загрузки файлов с использованием Commons Fileupload и JSP, для использования Spring Controllers.Учитывая, что большая часть кода для загрузки файлов основана на Commons Fileupload, я хочу использовать этот код повторно.Была предпринята первая попытка прямого перемещения кода из JSP в Spring Controller, например:

    @RequestMapping(path = { "/my/file/upload/request/mapping" })
    public ModelAndView myControllerMethod(HttpServletRequest request, HttpServletResponse response){

    List<FileItem> items = null;
    if (ServletFileUpload.isMultipartContent(request)) {
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        items = upload.parseRequest(request);
        System.out.println("number of items: " + (items !=  null ? items.size() : "null"));
    }
    ...

Хотя программа вводит if, распознавая его как составной запрос, это всегда показывает number of items: 0.

Я включил MultipartViewResolver, например:

@Configuration
@EnableWebMvc
@SuppressWarnings("deprecation")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter{

    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(maxFileUploadSizeBytes);

        return multipartResolver;
    }

, но результат одинаков с или без него.

Как указано во многих местах (например, здесь (Baeldung) и здесь (SO) ), кажется, что Commons Fileupload не может прочитать составную часть, потому что она уже была прочитана Spring.Таким образом, решение состоит в том, чтобы отключить поддержку Spring multipart.Во многих постах рассказывается, как это сделать для Spring Boot, но я понятия не имею, как это сделать для raw Spring 5 .Есть идеи о том, как это сделать?

Примечание : Я также пытался получить составные файлы, используя Spring , например:

@RequestMapping(path = { "/my/file/upload/request/mapping" })
public ModelAndView myControllerMethod(@RequestParam MultipartFile file){

и даже @RequestParam MultipartFile[] files, но я получаю пустые файлы или массив пустых файлов соответственно.Опять же, я проверил с помощью консоли Firefox, что выполняемый запрос точно такой же, как и со старым кодом JSP, который работал, , поэтому проблема не в том, что выполняемый запрос .

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Убедитесь, что ваша форма имеет атрибут, enctype = "multipart / form-data" ;

<form enctype="multipart/form-data" >

</form>

, после чего ваш параметр запроса необходимо исправить;

@ RequestParam ("file") Файл MultipartFile

нельзя проверить с помощью следующего условия, и сохранить составную часть в байтовом массиве

if(file.isEmpty()){
 byte [] bytefile= file.getBytes();
}
else{
   logger.info("not caught");
}
0 голосов
/ 14 декабря 2018

Вам не хватает имени параметра запроса для привязки.

См. Здесь java doc Spring

Например,

@RequestParam("file") MultipartFile multipartFile 

"file" - это имя параметра запроса в вашем JSP .

<input type="file" name="file"><br />

И убедитесь, что вы используете Метод POST , а также.

@RequestMapping(value = "/my/file/upload/request/mapping", method = RequestMethod.POST)
...