복붙노트

[SPRING] Spring MVC : 필요한 매개 변수가있는 경우에도 파일 업로드에 잘못된 요청 (매개 변수 누락) 발생

SPRING

Spring MVC : 필요한 매개 변수가있는 경우에도 파일 업로드에 잘못된 요청 (매개 변수 누락) 발생

파일 업로드 컨트롤러에 다음과 같은 메서드가 있습니다.

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = {"*/*", "application/json"})
public @ResponseBody ScriptUploadResponse upload(@RequestParam("userId") Long userId, @RequestParam("script") MultipartFile file) {
    return scriptService.upload(userId, file);
}

이것은 스프링 3에서 XML 기반 설정을 사용하여 잘 작동했다. 최근 스프링 4로 자바 기반 설정으로 넘어갔습니다. 파일을 업로드 할 때 userId가 제공되지 않았다는 불만과 함께 400 : Bad 요청이 발생합니다. 그러나 브라우저에서 요청을 볼 때 이것은 내가 보는 것입니다.

------WebKitFormBoundaryoJhTJ817NockqUSY
Content-Disposition: form-data; name="userId"

1
------WebKitFormBoundaryoJhTJ817NockqUSY
Content-Disposition: form-data; name="script"; filename="script.js"
Content-Type: application/javascript


------WebKitFormBoundaryoJhTJ817NockqUSY--

봄 주장 :

페이로드에 그것이 존재한다고 표시 될 때 userId를 제공하지 않았다는 이유는 무엇입니까?

최신 정보

RequestParamMethodArgumentResolver.java (내부 스프링 클래스) 안에 중단 점을 넣었고 HttpServletRequest 객체의 getParts ()가 아무 것도 반환하지 않는 것을 볼 수 있습니다. 왜 이런 일이 일어나고 있는지 모르겠지만 문제의 근원 인 것 같습니다. 브라우저에서 요청이 만들어 졌음을 알 수 있지만, 어떤 이유로 든 멀티 파트 데이터는이를 처리하지 못합니다.

해결법

  1. ==============================

    1.나는 이것을 알아낼 수 있었다. 멀티 파트 파일에 대한 지원을 사용하려면 특정 방식으로 구성해야합니다. 이것에 대한 문서는 절망적으로 발견하기가 어려웠으며 이것에 관한 Spring의 문서는 불완전하거나 XML 기반의 설정과 관련이있는 것으로 보인다. 내가 잘못된 장소에서 무엇을 찾고 있는지 잘 모르겠다.하지만 구글을 사용해도 이것을 설정하는 방법을 설명하는 단일 장소를 찾을 수 없었다. 어쨌든, 여기 있습니다.

    나는 이것을 알아낼 수 있었다. 멀티 파트 파일에 대한 지원을 사용하려면 특정 방식으로 구성해야합니다. 이것에 대한 문서는 절망적으로 발견하기가 어려웠으며 이것에 관한 Spring의 문서는 불완전하거나 XML 기반의 설정과 관련이있는 것으로 보인다. 내가 잘못된 장소에서 무엇을 찾고 있는지 잘 모르겠다.하지만 구글을 사용해도 이것을 설정하는 방법을 설명하는 단일 장소를 찾을 수 없었다. 어쨌든, 여기 있습니다.

    먼저 웹 구성에 bean을 포함시켜야합니다. 간단히 WebMvcConfigurerAdapter를 확장 한 구성 클래스에 다음을 추가했습니다.

    @Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }
    

    그러나 이것으로는 충분하지 않습니다. Servlet 3.0을 사용하고 Java 기반 구성을 사용하는 경우 다중 파트 파일을 지원하도록 Dispatcher 서블릿을 구성해야합니다.

    내 이니셜 라이저 (WebApplicationInitializer를 확장)에 다음 클래스를 추가했습니다.

    dispatcher.setMultipartConfig(
            new MultipartConfigElement("/tmp", 25 * 1024 * 1024, 125 * 1024 * 1024, 1 * 1024 * 1024)
    );
    

    전체 메서드는 다음과 같이 끝납니다.

    @Override
    public void onStartup(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(ApplicationConfig.class, WebConfig.class);
    
        servletContext.addListener(new ContextLoaderListener(rootContext));
    
        //Spring security
        servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain")).addMappingForUrlPatterns(null, false, "/*");
    
        //Enable multipart support
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(rootContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    
        dispatcher.setMultipartConfig(
                new MultipartConfigElement("/tmp", 25 * 1024 * 1024, 125 * 1024 * 1024, 1 * 1024 * 1024)
        );
    }
    
  2. from https://stackoverflow.com/questions/25109945/spring-mvc-bad-request-parameter-missing-on-file-upload-even-when-required-pa by cc-by-sa and MIT license