Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

동영상 업로드 기능 구현하기 #26

Open
3 of 4 tasks
hanbin9775 opened this issue Aug 8, 2021 · 6 comments
Open
3 of 4 tasks

동영상 업로드 기능 구현하기 #26

hanbin9775 opened this issue Aug 8, 2021 · 6 comments
Assignees

Comments

@hanbin9775
Copy link
Collaborator

hanbin9775 commented Aug 8, 2021

이 부분은 서로 공유하고 공부할 부분이 많을 것 같아서 따로 이슈를 팠다.

Upload process

스크린샷 2021-08-08 오후 9 41 18

스크린샷 2021-08-08 오후 9 41 43

스크린샷 2021-08-08 오후 9 42 22

스크린샷 2021-08-08 오후 9 42 42

스크린샷 2021-08-08 오후 9 43 47

스크린샷 2021-08-08 오후 9 43 03

TODO

  • 모달 마지막 페이지 구현
  • axios 로 백 연결
  • x아이콘과 마지막 버튼에 모달 닫기 추가
  • 맨앞 페이지 커서 바꾸기
gigibean added a commit that referenced this issue Aug 11, 2021
* 모달 공통모듈 wrapper (width height borderRadius) 추가
* 비디오 모달 비디오 가로 비율 맞춤
* 비디오 모달 비디오 백그라운드 #000로 변환
*메인 페이지에 임의 upload button 추가
* 임의 upload button에 upload 모달 연결
gigibean added a commit that referenced this issue Aug 11, 2021
* 모달 페이지 분리
* 모달 레이아웃
* 모달 버튼 구현
* 모달 사진 이어지는 기능 구현

- [ ] 모달 마지막 페이지 구현
- [ ] axios 로 백 연결
- [ ] x아이콘과 마지막 버튼에 모달 닫기 추가
hanbin9775 added a commit that referenced this issue Aug 15, 2021
@hanbin9775
Copy link
Collaborator Author

스크린샷 2021-08-15 오후 9 58 18

payload가 너무 크다는데 클라이언트에서 보내는 request 제한 문제인지 server측 문제인지 함 알아보자.

@hanbin9775
Copy link
Collaborator Author

hanbin9775 commented Aug 15, 2021

axios config?

const customAxios: AxiosInstance = axios.create({
  baseURL: process.env.REACT_APP_SERVER,
  headers: {
    Authorization: `Bearer ${Token.getToken('access_token')}`,
  },
  maxContentLength: 100000000,
  maxBodyLength: 100000000,
});

axios 기본 config가 혹시 너무 작아서 발생하는 문젠가 싶어 위와같이 작성해서 요청해보았는데 같은 에러 발생

413 error

https://developer.mozilla.org/ko/docs/Web/HTTP/Status/413 모질라 문서에 따르면 413 응답 상태 코드는 요청 엔터티가 서버에 의해 정의된 제한보다 커서 발생하는 에러라고 한다. 흠.. 현재 시간 기준으로 정상작동하는 POST /videos api는 아직 배포가 안되어서 그런가보다. 배포되면 다시 테스트해봐야겠다.

근데 왜 500 에러가 안뜨고 413 에러가 뜨는거지..????

@hanbin9775
Copy link
Collaborator Author

Content-Type

기존에는 request header의 content-type이 다음과 같이 설정되어있었다.

content-type: application/json;charset=UTF-8

위 콘텐트 타입은 utf-8 인코딩된 json 포맷의 파일을 보낸다는 설정이다. 위 콘텐트 타입으로 동영상같이 크기가 큰 파일을 보낸다고 설정하면 413에러가 발생한다는 사실을 알았다.

axios 함수에 다음과 같은 config 파라미터를 추가해 content-type 헤더를 수정해주자.

headers: {
      'Content-Type': 'multipart/form-data',
    },

하지만 이제 500 error

이제는 500 sever internal 에러가 발생한다. 이 문제를 다시해결해보자
스크린샷 2021-08-15 오후 11 53 11

@hanbin9775
Copy link
Collaborator Author

hanbin9775 commented Aug 15, 2021

multipart/form-data 포맷에 맞게 payload 구성하기

스크린샷 2021-08-16 오전 12 49 17

박건님이 개발해주신 video post api는 multipart/form-data에 맞는 request만 받아드린다. 그럼 이에 맞는 payload를 작성해야한다.
500에러가 발생했던건 이 포맷에 맞지 않은 payload를 작성했기 때문이다.

인코딩 타입이 multipart/form-data 으로 설정되었을 경우 form에서 사용하는 것과 동일한 포맷을 사용해야 한다.
따라서 json 형태가 아닌 FormData라는 객체로 form을 만들어 보내줘야한다.
구성하는 방법은 다음과 같다.

  const formData = new FormData();
  formData.append('userId', dto.userId);
  formData.append('describe', dto.describe);
  formData.append('category', dto.category);
  formData.append('description', dto.description as string);
  formData.append('video', dto.video as Blob);

FileReader vs File

그리고 내가 계속 헤맸던 부분은 계속 form data에 FileReader로 읽은 파일을 보내려고 했던 것이다.
FileReader는 말그대로 파일을 읽어 클라이언트 단에서 볼 수 있게 함이고, 우리가 실제로 보내야하는 것은 FileReader로 읽기 전의 File 그 자체였다.

문제해결

결국 문제 해결! 제대로 api가 작동함을 확인하였다.
스크린샷 2021-08-16 오전 1 38 49

@hanbin9775 hanbin9775 self-assigned this Aug 15, 2021
gigibean added a commit that referenced this issue Aug 18, 2021
SoonGwan added a commit that referenced this issue Aug 18, 2021
@SoonGwan
Copy link
Member

SoonGwan commented Aug 18, 2021

한빈님은 정리를 잘 하시는 것 같아 너무 부럽습니다 ㅠㅠㅠㅠㅠㅠ
감사합니다 👍 👍 👍
많은걸 배우고 갑니당

@hanbin9775
Copy link
Collaborator Author

한빈님은 정리를 잘 하시는 것 같아 너무 부럽습니다 ㅠㅠㅠㅠㅠㅠ
감사합니다 👍 👍 👍
많은걸 배우고 갑니당

헉 도움이 되셨다니 정말 다행입니다. 정리해둔 보람이 있네요 ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants