[SPRING] Spring 3.2-mvc를 사용하여 큰 이미지를 업로드 / 스트리밍하는 방법
SPRINGSpring 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.봄을 사용하는 것처럼 보이므로 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.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.나는 이것을 최근에 해냈다. 자세한 내용은 여기를 보라.
나는 이것을 최근에 해냈다. 자세한 내용은 여기를 보라.
브라우저에서 파일 API를 사용하여 파일을로드 한 다음 Base64 인코딩을 사용하여 내용을 인코딩하고 마지막으로 인코딩 된 내용을 게시하기 전에 자바 스크립트 객체에 할당 할 수 있습니다.
서버에는 요청을 처리 할 Spring Controller가 있습니다. 요청 본문을 java 객체로 변환하는 json unmarshalling의 일부로 이미지 바이트의 base64 인코딩 값은 표준 Java byte []로 변환되어 데이터베이스에 LOB로 저장됩니다.
이미지를 검색하기 위해 다른 Spring Controller 메소드는 바이트를 직접 스트리밍하여 이미지를 제공 할 수 있습니다.
위에 링크 된 블로그 게시물은 이미지를 다른 객체의 일부로 사용하려는 것으로 가정하지만 이미지를 직접 사용하기를 원할 경우 원칙이 동일해야합니다. 설명이 필요한 것이 있으면 알려주세요.
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.0의 다중 특성 파일 (0) | 2019.01.29 |
---|---|
[SPRING] JSP에서의 Spring MVC 요청 URL (0) | 2019.01.29 |
[SPRING] web.xml url-pattern matcher에는 URL을 제외시키는 방법이 있습니까? (0) | 2019.01.29 |
[SPRING] clone 또는 BeanUtils.copyProperties를 사용해야하며 이유는 무엇입니까? (0) | 2019.01.29 |
[SPRING] 스프링 MVC 웹 응용 프로그램 : 응용 프로그램 컨텍스트가 두 번 시작됩니다. (0) | 2019.01.29 |