2016-08-08 1 views
0

content-type이 multipart/related 인 요청을 사용해야합니다. 요청은 이미지, json 페이로드 및 바이너리 콘텐츠로 구성됩니다. Spring 부트 애플리케이션에서 이러한 요청을 처리하는 방법에 대한 예제를 찾으려고했지만 multipart/form-data 요청을 처리하는 방법에 대한 참조가 있지만 multipart/related MIME 유형과 관련된 것은 없습니다.스프링 부트 멀티 파트/관련 마임 타입 지원

POST /upload 
Content-Type: multipart/related; boundary="123asdf234" 
--123asdf234 
Content-Type: application/json; charset=UTF-8 
Content-Disposition: form-data 
{ 
    "json": "payload" 

} 
—-123asdf234 
Content-Type: application/zip 
Content-Disposition: file-data; filename="some.zip"; size=123456; 
<binary-attachment-content> 
—-123asdf234 
Content-Type: image/png 
Content-Disposition: file-data; filename="image1.png"; size=123456; 
<binary-attachment-content> 
—-123asdf234-— 

사람이 봄 부팅 응용 프로그램에서이 요청을 처리하는 방법을 말해 줄 수 :

요청이 같은 것입니다. JaxRS를 사용하고 있습니다.

답변

2

이를 해결하기 위해 먼저 JAX-RS와 관련하여 multipart/related를 올바르게 이해하기 위해 http://cxf.apache.org/docs/jax-rs-multiparts.html을 참조했습니다. 다음으로 나는 스프링 문서를 JAX-RS이라고 말하고 그것을 해결하기 위해 저지 종속성을 사용하기로 결정했다. 그런 다음 Jersey documentation을 참조하여 다음 테스트 프로젝트를 빌드합니다. https://github.com/ShawnTuatara/stackoverflow-38838926. 주요 예는 다음과 같습니다.

package ca.tuatara.stackoverflow; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

import org.glassfish.jersey.media.multipart.BodyPart; 
import org.glassfish.jersey.media.multipart.FormDataParam; 
import org.glassfish.jersey.media.multipart.MultiPart; 
import org.glassfish.jersey.media.multipart.MultiPartFeature; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.stereotype.Component; 

@SpringBootApplication 
public class Stackoverflow38838926Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Stackoverflow38838926Application.class, args); 
    } 

    @Component 
    public class JerseyConfig extends ResourceConfig { 
     public JerseyConfig() { 
      register(MultiPartFeature.class); 
      register(MultipartHandler.class); 
      register(MultipartPartsHandler.class); 
     } 
    } 

    @Component 
    @Path("/upload") 
    @Consumes("multipart/*") 
    @Produces("text/text") 
    public class MultipartHandler { 
     @POST 
     public String upload(MultiPart request) { 
      StringBuffer response = new StringBuffer(); 
      for (BodyPart part : request.getBodyParts()) { 
       if (MediaType.APPLICATION_JSON_TYPE.isCompatible(part.getMediaType())) { 
        response.append(part.getEntityAs(JsonModel.class)); 
       } else if (MediaType.APPLICATION_XML_TYPE.isCompatible(part.getMediaType())) { 
        response.append(part.getEntityAs(XmlModel.class)); 
       } 
       response.append(System.lineSeparator()); 
      } 
      return response.toString(); 
     } 
    } 

    @Component 
    @Path("/uploadParts") 
    @Consumes("multipart/*") 
    @Produces("text/text") 
    public class MultipartPartsHandler { 
     @POST 
     public String upload(@FormDataParam("json") JsonModel json, @FormDataParam("xml") XmlModel xml) { 
      return json + System.lineSeparator() + xml; 
     } 
    } 
} 

테스트는 멀티 파트 요청을 보내는 방법을 보여줍니다. 테스트가 실행될 때 와이어를 통해 진행되는 작업을 정확히 볼 수 있도록 디버깅 로깅을 유지했습니다.

원래 POST 페이로드에는 몇 가지 문제가있어 제대로 파싱되지 않습니다. 내용은 헤더와 내용 사이에 줄 바꿈이 있어야합니다. Content-Disposition에 "name"속성을 제공하지 않으면 첫 번째 예제 ("/ upload") 만 사용할 수 있습니다. 양식 데이터의 이름을 지정하면 두 번째 예제 ("/ uploadParts")를 사용할 수 있습니다. 이미지 또는 파일 업로드 예제를 사용하지 않았지만 Jersey 멀티 파트 페이지를 읽으면 요청 메소드에 해당 매개 변수 입력을 추가하는 것이 간단합니다.

+0

Shawn에게 도움을 주셔서 감사합니다. 나는 이것을 시험해보고, 필요하다면 더 많은 도움을 얻기 위해 다시 만날 것이다. 이것은 유망 해 보인다! – Coder