복붙노트

[SPRING] SpringMVC-FileUpload - 클라이언트가 보낸 요청의 구문이 올바르지 않습니다.

SPRING

SpringMVC-FileUpload - 클라이언트가 보낸 요청의 구문이 올바르지 않습니다.

나는 동일한 주제에 대한 몇 가지 질문을 보았다. 그러나 나는이 오류의 단서를 찾지 못했습니다.

나는 POC에서 일하고 있으며 아래 링크를 따라 가고있다. http://spring.io/guides/gs/uploading-files/

위의 튜토리얼에서 언급했듯이, 독립 실행 형 모드 [Tomcat이 포함 된 스프링]에서는 아무런 문제없이 작동합니다. 하지만 웹 응용 프로그램으로 배포하고 싶습니다. 그래서 별도의 SpringMVC 프로젝트를 만들고 다음 컨트롤러를 추가했습니다.

컨트롤러 파일

@Controller
public class FileUploadController {

    @RequestMapping(value="/upload", method=RequestMethod.GET)
    public @ResponseBody String provideUploadInfo() {
        return "You can upload a file by posting to this same URL.";
    }

    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public @ResponseBody String handleFileUpload(@RequestParam("name") String name, 
            @RequestParam("file") MultipartFile file){
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream = 
                        new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "You successfully uploaded " + name + " into " + name + "-uploaded !";
            } catch (Exception e) {
                return "You failed to upload " + name + " => " + e.getMessage();
            }
        } else {
            return "You failed to upload " + name + " because the file was empty.";
        }
    }

}

다음 클라이언트를 작성했습니다 (여기서는 RestTemplate을 사용하지 않으므로).

고객 서비스

private static final String URL_GET = "http://localhost:8080/SpringMVC/upload";
static String URL = "http://localhost:8080/SpringMVC/upload";

public static void main(String[] args) throws Exception {
    PropertyConfigurator.configure("C:/DevEnvProject/eclipse/workspace_exp/OCR/log4j.properties");
    testGet();
    testPOST();
}

private static void testGet() throws ClientProtocolException, IOException {
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpGet = new HttpGet(URL_GET);
    HttpResponse response = httpClient.execute(httpGet, localContext);

    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    String sResponse = reader.readLine();

} 

static void testPOST() {
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(URL);

        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        entity.addPart("name", new StringBody("testIcon.png"));
        entity.addPart("file", new FileBody(new File("C:/testIcon.png")));
        httpPost.setEntity(entity);
        HttpResponse response = httpClient.execute(httpPost, localContext);


        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
        String sResponse = reader.readLine();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

POST 끝점에 대한 호출을 성공적으로 수행 할 수 없습니다. 매번 다음 예외가 발생합니다.

400 Bad Request - 클라이언트가 보낸 요청의 구문이 올바르지 않습니다.

'GET'통화가 정상적으로 작동합니다. 나는 'POST'요청의 로그를 스프링 튜토리얼에서 언급 한 독립형 접근 방식으로 테스트하는 동안 얻은 동일한 'POST'요청과 비교했다. 요청 부분에서 diff를 찾지 못했습니다.

나는이 게시물에서 나는 아주 장황하다는 것을 안다. 나는 가능한 한 많은 문맥 정보를주고 싶었다. 도와주세요.

감사

해결법

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

    1.당신이해야 할 2 가지가 있습니다 :

    당신이해야 할 2 가지가 있습니다 :

    먼저 Apache Commons FileUpload 라이브러리를 클래스 경로에 추가하십시오. 당신이 maven을 사용한다면, 당신은 여기서 의존 관계를 얻을 수있다. 그렇지 않으면 jar를 다운로드하여 수동으로 추가 할 수 있습니다.

    둘째, multipartResolver라는 이름으로 컨텍스트에서 MultipartResolver 빈을 선언해야한다. Apache Commons FileUpload를 사용하면 CommonsMultipartResolver를 사용할 수 있습니다. 예를 들어, Java 구성을 사용하면

    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
        // set any fields
        return commonsMultipartResolver; 
    }
    

    XML 설정을 사용하면,

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
        <!-- set any properties -->
    </bean>
    

    이것은 Spring 공식 문서에 더 자세히 설명되어 있습니다.

  2. from https://stackoverflow.com/questions/20179118/springmvc-fileupload-the-request-sent-by-the-client-was-syntactically-incorrec by cc-by-sa and MIT license