programing

스프링 부트json 본문의 일부로 멀티파트 파일 업로드

linuxpc 2023. 8. 24. 21:50
반응형

스프링 부트json 본문의 일부로 멀티파트 파일 업로드

다중 파트 파일 및 기타 데이터가 포함된 json 페이로드를 허용할 수 있는 게시물 끝점이 있는지 알고 싶습니다. 예를 들어, 내 본문 개체는 다음과 같습니다.

public class Bio {
    private Long id;
    private String firstName;
    private MultipartFile imageFile;
}

별도의 관련 질문은 파일 업로드를 위한 springboot doc 예제에서 https://spring.io/guides/gs/uploading-files/, 파일이 페이로드가 아닌 요청 경로의 일부라는 것입니다.제가 보기에 이상한데 요청 본문에 파일을 바인딩할 수 있는 방법이 있나요?

제가 예전에 했던 방법은 파일용과 첨부된 JSON용으로 두 부분을 따로 업로드하는 것입니다.컨트롤러 방법은 다음과 같습니다.

public void create(@RequestPart("foo") Foo foo,
        @RequestPart("image") MultipartFile image)
    // …
}

그러면 다음과 같은 요청이 사용됩니다.

Content-Type: multipart/mixed; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name="foo"
Content-Type: application/json;charset=UTF-8
{"a":"alpha","b":"bravo"}
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name="image"; filename="foo.png"
Content-Type: application/octet-stream
Content-Length: 734003
<binary data>
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--

@RequestPart를 사용하는 Andy의 솔루션은 완벽하게 작동했습니다.그러나 우체부가 답변에 설명된 바와 같이 경계를 적절하게 설정하기 위해 각 멀티파트의 콘텐츠 유형을 지정하는 것을 지원하지 않는 것처럼 보이기 때문에 우체부와 검증할 수 없습니다.

curl 명령을 사용하여 payload와 파일을 모두 첨부하려면 다음과 같은 작업을 수행할 수 있습니다.

curl -i -X POST -H "Content-Type: multipart/mixed" \
-F "somepayload={\"name\":\"mypayloadname\"};type=application/json" \
-F "uploadfile=@somevalid.zip" http://localhost:8080/url

페이로드 내용과 유효한 내용을 이스케이프해야 합니다.zip은 curl이 실행되는 동일한 디렉토리에 있거나 파일에 대한 유효한 경로로 대체해야 합니다.

언급URL : https://stackoverflow.com/questions/28179251/spring-boot-multipart-file-upload-as-part-of-json-body

반응형