이미지 파일을 DB에 저장 하기에는 요량이 커서 비효율적이기 때문에 Storage Service를 이용한다.
Storage service는 AWS,GCP, Azure에서 제공 된다.
image upload process
1. 브라우저에서 사용자가 업로들할 파일을 선택한다.
2. 브라우저에서 선택된 파일을 변수에 저장
변수에 담신 내용을 파일 객체라고 하면 파일 사이즈 등 파일에 대한 정보를 담고 있음
3. 파일 객체를 백엔드 서버에 업로드 요청
백엔드 서버의 파일 업로드 API작동
file.resovler.ts에는 uploadFile이라는 API가 있다 service의 upload()를 return
file.service.ts에는 upload()를 이용하기 위해서는 FileService를 constructor에 주입한다.
return 값으로 FileService의 Upload를 톧해 URL주소를 반환해서 브라우저에 보내준다.
src/main.ts에는 app.use(graphqlUploadExpress());를 더해준다.
4. 백엔드 서버 API를 통해 받은 파일을 DB에 저장시 BLOB타입으로 저장
이미지 파일은 storage 서비스에 대신 저장
이미지 파일 storage에 저장되는 과정
1. API를 요청하면 이미지가 storage에 파일로 저장된다.
2. storage에서는 파일을 저장한 결과로 사진을 다운로드 할 수 있는 주소를 반환
3. 백엔드에서는 반환된 주소를 브라우저로 보내준다.
->파일 첨부해서 요청을 보내면 이런 file 정보가 뜬다.
GCP를 사용하기 위해서는 Storage를 새로 생성해야 한다.
projectID: GCP에서 사용할 사용할 ID
KeyFilename: Cloud Storage를 사용하기 위한 인증에 필요한 key의 파일명
bucket: GCP-Cloud Storage 에서 업로드된파일이 저당된 버킷명
그리고
const waitedfiles = await Promise.all(files);
로 파일을 가지고 온다
const results = Promise.all(
waitedfiles.map(
(el) =>
new Promise((resolve, reject) => {
el.createReadStream()
.pipe(storage.file(el.filename).createWriteStream())
.on('finish', () => resolve(`${bucket}/${el.filename}`))
.on('error', () => reject('실패'));
}),
),
);
map을 사용해서 streamd을 통해 읽고 storage에 저장한다.
화면에 이미지 파일 보이는 과정