image/jpeg,image/jpg, 를 지원하지 않는다는 에러가 떴습니다 . png, webp도 마찬가지였습니다.
제가 보내는 타입마다 그 타입은 지원하지 않는다 라는 무슨 초 적응 생명체가 되어버린 무적의 에러가 뜨는 것 입니다..
그래서 이 시점에서 구글링을 열심히 해본결과 Spring webflux에선 MultipartFile.class 를 사용하지 않고 Filepart 형식으로 multipart/form-data 를 처리한다는 사실을 알아내게 되었습니다.
-따라서 구현을 해보았는데요 .
new PutObjectRequest() 가 파일 업로드를 담당하는 객체입니다. 매개변수로 ,s3버켓의 이름, 파일이름, 파일의 inputstream, 파일의 metadata값을 받습니다.
저같은경우는 metadata 설정을 위해서 new objectmetadata 객체를 생성해서
업로드요청을 한 FilePart 안에있는 ContentType과 ContentLength 를 꺼내서 metadata를 설정해서 넘겨주면 되겠다!
라고 판단하고 업로드 요청을 보내봤습니다만.
reactor.core.Exceptions$ErrorCallbackNotImplemented: com.amazonaws.services.s3.model.AmazonS3Exception: The request signature we calculated does not match the signature you provided. Check your key and signing method. (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: YRCSMZ7Q18TF3H28; S3 Extended Request ID: ha6p1admq3OnBTaIKSnrCgBdwZVKMFVueH3Fd8JvxVMlrkMGGeTh+4l/i1QcG424Ik42gqPzm+QFc9zYZZn6Qw==; Proxy: null), S3 Extended Request ID: ha6p1admq3OnBTaIKSnrCgBdwZVKMFVueH3Fd8JvxVMlrkMGGeTh+4l/i1QcG424Ik42gqPzm+QFc9zYZZn6Qw==
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: The request signature we calculated does not match the signature you provided. Check your key and signing method. (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: YRCSMZ7Q18TF3H28; S3 Extended Request ID: ha6p1admq3OnBTaIKSnrCgBdwZVKMFVueH3Fd8JvxVMlrkMGGeTh+4l/i1QcG424Ik42gqPzm+QFc9zYZZn6Qw==; Proxy: null)
【The request signature we calculated does not match the signature you provided .】 라는 에러를 만났고 대체 달라는대로 줬더니 왜 안맞는다는거냐. 라고 생각해서 구글링을 해본결과 해결한 사람들은 accessKey나 SecretKey값이 달랐다느니, SecretKey에 특수문자가 껴있으면 안되니까 없을때까지 재생성해보라느니 (무슨 민간요법도아니고) 그래서 저도 IAM 계정을 다섯번 정도 생성해서 특수문자가 없는 시크릿키 계정으로 시도해도 똑같았습니다
ㅋㅋ그럼그렇지
그렇게 스택오버플로우를 헤집고다니며 디지털 노마드가 되어가는 와중에 content-length가 요청과 일치하지 않을 때 발생하는 에러일수도있다는 댓글을 보고 FilePart에서 ContentLength를 log를 찍어봤습니다.
그랬더니 ...??
-1 값이 떴는데요 전송이 끝나기전까지 length를 모르기 때문에 뜨는 값이라고 나왔습니다.
그렇기에 -1을 메타데이터에 넣는게아니라 , '그러면 요청 헤더에서 content-length 뽑아와서 집어넣어 줘볼까? " 라는 생각으로
@ReuqestHeader 에서 cotentLength를 뽑아서 메타데이터에 넣었더니
dataLength는 1024 (아마도 해당요청이 1회당 퍼올릴수있는 Byte[] 의 최대 크기라고 생각함 ) expectedLength는 요청헤더에서 뽑아준 크기만큼 나왔습니다..
화가 난 저는 너 알아서 해보라고 메타데이터에 contentLength를 지정안해주고 요청을 보내보기도 해봤는데요
이 친구가 메모리 없다고 저보다 화가 더 많이 났더라구요 .
( contentLength를 metadata 에 지정을 안해주었을 경우 뜨는 에러입니다.. )
(중간에 FileFile의 내용을 inputstream을 bufferdImage로 변환하고 bufferdImage를 File 로 생성해서 전송하는 방법도 시도해보았는데요. 마찬가지 였습니다..)
지금와서 생각해보니 제가 들어오는 inputstream을 차곡차곡 담고 담고 담은 inpustream 완전체를 S3에 보내줬어야 하지않았나~ 라는 생각이 듭니다. 하지만 구현 해보라고 한다면 못할 것 같습니다.. 구현 실력을 좀 더 키운다음에 도전해 보아야겠습니다.
혹시 구현방법을 알고계신분은 가르쳐주시면 감사하겠습니다. 어떻게 구글링 해야할지 모르겠어서 밑의 깃허브 방법을 시도했습니다..
감사합니다...
결국엔 AWS S3 에서 지원하는 s3 multipart upload API 로 구현에 성공했습니다..
하루종일 뭐한거지?