복붙노트

[SPRING] Spring 3.2-mvc를 사용하여 큰 이미지를 업로드 / 스트리밍하는 방법

SPRING

Spring 3.2-mvc를 사용하여 큰 이미지를 업로드 / 스트리밍하는 방법

파일을 가져 와서 데이터베이스에 저장하는 REST 컨트롤러에 큰 이미지를 업로드 / 스트리밍하려고합니다.

@Controller
@RequestMapping("/api/member/picture")
public class MemberPictureResourceController {

  @RequestMapping(value = "", method = RequestMethod.POST)
  @ResponseStatus(HttpStatus.NO_CONTENT)
  public void addMemberPictureResource(@RequestBody InputStream image) {
    // Process and Store image in database
  }
}

이것은 내가 달성하려고 노력하고있는 것 (물론 InputStream이 작동하지 않는 것 같아요.)의 비 작동 예제입니다. @RequestBody를 통해 이미지를 스트리밍 / 읽으려고합니다.

나는 모든 곳을 수색했지만 좋은 결과를 얻을 수있는 방법을 찾을 수는 없습니다. 대부분의 사람들은 양식 위에 이미지를 업로드하는 방법 만 묻는 것 같지만 REST / RestTemplate을 사용하지 마십시오. 이걸로 나를 도울 수있는 사람이 있습니까?

올바른 방향에 대한 어떤 힌트에 감사드립니다.

친절하고, 크리스

솔루션

아래에서는 Dirk 및 Gigadot의 Input 이후에 저에게 도움이되는 솔루션을 게시하려고합니다. 지금은 두 솔루션을 모두 보면서 가치가 있다고 생각합니다. 처음에는 Dirk에서 얻은 도움으로 작업 예제를 게시하려고 시도했으며 Gigadot의 도움을 받아 하나를 만들려고합니다. @RequestBody를 통해 파일을 업로드하는 방법을 명시 적으로 묻는 동안 Dirks 응답을 올바른 것으로 표시합니다. 그러나 Gigadot에서 솔루션을 테스트하는 것이 더 쉽고 사용하기 쉽기 때문에 궁금합니다.

아래의 예제에서는 MongoDB GridFS에 파일을 저장합니다.

해결책 1 - Dirks 권고 이후의 예

컨트롤러 (코멘트에서 테스트하기위한 curl 명령 포함) :

/**
*
* @author charms
* curl -v -H "Content-Type:image/jpeg" -X PUT --data-binary @star.jpg http://localhost:8080/api/cardprovider/logo/12345
*/
@Controller
@RequestMapping("/api/cardprovider/logo/{cardprovider_id}")
public class CardproviderLogoResourceController {

  @Resource(name = "cardproviderLogoService")
  private CardproviderLogoService cardproviderLogoService;

  @RequestMapping(value = "", method = RequestMethod.PUT)
  @ResponseStatus(HttpStatus.NO_CONTENT)
  public void addCardproviderLogo(@PathVariable("cardprovider_id") String cardprovider_id,
      HttpEntity<byte[]> requestEntity) {
    byte[] payload = requestEntity.getBody();
    InputStream logo = new ByteArrayInputStream(payload);
    HttpHeaders headers = requestEntity.getHeaders();

    BasicDBObject metadata = new BasicDBObject();
    metadata.put("cardproviderId", cardprovider_id);
    metadata.put("contentType", headers.getContentType().toString());
    metadata.put("dirShortcut", "cardproviderLogo");
    metadata.put("filePath", "/resources/images/cardproviders/logos/"); 

    cardproviderLogoService.create1(logo, metadata);
  }
}

서비스 (미완성이지만 테스트로 작동) :

@Service
public class CardproviderLogoService {

  @Autowired
  GridFsOperations gridOperation;

  public Boolean create1(InputStream content, BasicDBObject metadata) {
    Boolean save_state = false;
    try {
      gridOperation.store(content, "demo.jpg", metadata);
      save_state = true;
    } catch (Exception ex) {
      Logger.getLogger(CardproviderLogoService.class.getName())
          .log(Level.SEVERE, "Storage of Logo failed!", ex);
    }
    return save_state;    
  }
}

해결책 2 - Gigadots 권고안의 예

이것은 스프링 매뉴얼에 설명되어있다. http://static.springsource.org/spring/docs/3.2.1.RELEASE/spring-framework-reference/html/mvc.html#mvc-multipart

이것은 매우 쉽고 기본적으로 모든 정보를 포함합니다. 적어도 바이너리 업로드에 대해서는이 솔루션을 사용할 것이라고 생각합니다.

게시하고 답변 해 주신 모든 분들께 감사드립니다. 대단히 감사합니다.

해결법

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

    1.봄을 사용하는 것처럼 보이므로 HttpEntity (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/HttpEntity.html)를 사용할 수 있습니다.

    봄을 사용하는 것처럼 보이므로 HttpEntity (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/HttpEntity.html)를 사용할 수 있습니다.

    그것을 사용하면 다음과 같은 것을 얻을 수 있습니다 ( '페이로드'를보십시오) :

    @Controller
    public class ImageServerEndpoint extends AbstractEndpoint {
    
    @Autowired private ImageMetadataFactory metaDataFactory;
    @Autowired private FileService fileService;
    
    @RequestMapping(value="/product/{spn}/image", method=RequestMethod.PUT) 
    public ModelAndView handleImageUpload(
            @PathVariable("spn") String spn,
            HttpEntity<byte[]> requestEntity, 
            HttpServletResponse response) throws IOException {
        byte[] payload = requestEntity.getBody();
        HttpHeaders headers = requestEntity.getHeaders();
    
        try {
            ProductImageMetadata metaData = metaDataFactory.newSpnInstance(spn, headers);
            fileService.store(metaData, payload);
            response.setStatus(HttpStatus.NO_CONTENT.value());
            return null;
        } catch (IOException ex) {
            return internalServerError(response);
        } catch (IllegalArgumentException ex) {
            return badRequest(response, "Content-Type missing or unknown.");
        }
    }
    

    우리는 RESTfull "이미지를 제품에 넣기"때문에 PUT을 사용하고 있습니다. 'spn'은 제품 번호이고 imagename은 fileService.store ()에 의해 생성됩니다. 물론 이미지 자원을 작성하기 위해 이미지를 POST 할 수도 있습니다.

  2. ==============================

    2.POST 요청을 보낼 때 양식 / 매개 변수 / 파일을 서버 (예 : application / x-www-form-urlencoded 및 multipart / form-data)로 보내는 데 사용할 수있는 두 가지 인코딩 유형이 있습니다. 여기에 대한 더 많은 독서입니다.

    POST 요청을 보낼 때 양식 / 매개 변수 / 파일을 서버 (예 : application / x-www-form-urlencoded 및 multipart / form-data)로 보내는 데 사용할 수있는 두 가지 인코딩 유형이 있습니다. 여기에 대한 더 많은 독서입니다.

    application / x-www-form-urlencoded를 사용하는 것은 POST 요청에 큰 내용이있는 경우 좋은 생각이 아닙니다. 보통 내 경험으로 인해 웹 브라우저가 손상되기 때문입니다. 그러므로, multipart / form-data가 권장됩니다.

    디스패처에 멀티 파트 해결 프로그램을 추가하면 Spring이 다중 / 폼 데이터 콘텐츠를 자동으로 처리 할 수 ​​있습니다. 이것을 처리하기위한 Spring의 구현은 apache-commons-fileupload를 사용하여 수행되므로이 ​​라이브러리를 프로젝트에 추가해야한다.

    이제 실제로하는 방법의 주된 대답은 http://viralpatel.net/blogs/spring-mvc-multiple-file-upload-example/입니다.

    해결책을 찾는데 도움이되기를 바랍니다. REST가 무엇인지 읽어 볼 수 있습니다. 너 혼란스러워하는 것 같아. 기본적으로 거의 모든 HTTP 요청은 URL이 추악하더라도 RESTful입니다.

  3. ==============================

    3.나는 이것을 최근에 해냈다. 자세한 내용은 여기를 보라.

    나는 이것을 최근에 해냈다. 자세한 내용은 여기를 보라.

    브라우저에서 파일 API를 사용하여 파일을로드 한 다음 Base64 인코딩을 사용하여 내용을 인코딩하고 마지막으로 인코딩 된 내용을 게시하기 전에 자바 스크립트 객체에 할당 할 수 있습니다.

    서버에는 요청을 처리 할 Spring Controller가 있습니다. 요청 본문을 java 객체로 변환하는 json unmarshalling의 일부로 이미지 바이트의 base64 인코딩 값은 표준 Java byte []로 변환되어 데이터베이스에 LOB로 저장됩니다.

    이미지를 검색하기 위해 다른 Spring Controller 메소드는 바이트를 직접 스트리밍하여 이미지를 제공 할 수 있습니다.

    위에 링크 된 블로그 게시물은 이미지를 다른 객체의 일부로 사용하려는 것으로 가정하지만 이미지를 직접 사용하기를 원할 경우 원칙이 동일해야합니다. 설명이 필요한 것이 있으면 알려주세요.

  4. from https://stackoverflow.com/questions/14615692/how-do-i-upload-stream-large-images-using-spring-3-2-spring-mvc-in-a-restful-way by cc-by-sa and MIT license