일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프론트
- 회고록
- react-query
- 뷰
- AWS
- vue
- Firebase
- login
- 정리
- react
- 기획
- express
- vuex
- Docker
- plugin
- database
- 토이프로젝트
- jwt
- nginx
- PWA
- 배포
- 로그인
- extension
- 신상마켓
- 셋팅
- Git
- vue login
- 플러그인
- vsCode
- javascript
- Today
- Total
강디너의 개발 일지
Firebase storage + Firebase resize images 사용해보기 본문
목차
- Firebase storage 다루기
- Firebase resize images 사용해보기
1. Firebase storage
// storage.js
import * as firebase from 'firebase/app';
import 'firebase/storage';
// 파일 전체 목록 부르기 + url 가져오기
export async function getThumbnail(dealiName) {
const { items } = await firebase.storage().ref(`thumbnail/${dealiName}`).listAll();
let thumbnaills = [];
items.map((i) => {
const { fullPath } = i;
thumbnaills.push({
url: firebase.storage().ref(fullPath).getDownloadURL(),
fullPath,
});
})
return thumbnaills;
}
// 파일 넣기
export function uploadFile(dealiName, file) {
const ref = firebase.storage().ref(`thumbnail/${dealiName}/${file.name}`);
return ref.put(file);
}
// 파일 삭제
export function deleteFile(fullPath) {
return firebase.storage().ref(fullPath).delete();
}
// ThumbnailArea.vue
<template>
<div class="thumbnail">
<div class="thumbnail-list" v-for="(data, idx) in thumbnailList" :key="idx">
<img
class="thumbnail-list__item"
:class="{ active_btn : data.url.i === selectThumbnail }"
:src="data.url.i"
alt="이미지"
@click="clickThumbnail(data.url)"
/>
<img class="icon" :src="deleteIcon" alt="삭제" @click="deleteThumbnail(data.fullPath)" />
</div>
<div class="icon_area">
<img class="add_icon" :src="addImageIcon" alt="이미지 추가" @click="$refs.file.click()" />
</div>
<input type="file" ref="file" @change="fileChange" style="display:none" multiple />
</div>
</template>
<script>
import { getThumbnail, uploadFile, deleteFile } from "@/services/storage";
import 생략
const thumbnailsData = (props, emit) => {
const selectThumbnail = computed(() => props.value);
const thumbnailList = ref([]);
const file = ref("");
const getThumbnails = async () => {
thumbnailList.value = await getThumbnail(props.dealiName);
};
const clickThumbnail = (data) => {
emit("input", data.i);
};
const deleteThumbnail = async (fullPath) => {
if (!confirm('삭제하시겠습니까?')) return;
await deleteFile(fullPath);
await getThumbnails();
};
const fileChange = async (e) => {
await uploadFile(props.dealiName, e.target.files[0]);
await getThumbnails();
};
return {
selectThumbnail,
clickThumbnail,
addImageIcon,
thumbnailList,
file,
fileChange,
deleteIcon,
deleteThumbnail,
...getThumbnails()
};
};
파일 추가 - https://firebase.google.com/docs/storage/web/upload-files?hl=ko
파일이 변경이 되면 fileChange 함수가 실행돼서 uploadFile에 파일을 보냅니다.
+ 버튼을 클릭하면 파일 업로드를 할 수 있도록 트리거를 만들었습니다.
파일 리스트 - https://firebase.google.com/docs/storage/web/list-files?hl=ko
getThumbnails 함수 호출하면 thumbnailList 값이 채워집니다.
파일 삭제 - https://firebase.google.com/docs/storage/web/delete-files?hl=ko
해당 파일의 fullPath를 보내서 삭제해야 합니다. (그래서 리스트 만들 때 fullPath를 넣었습니다)
2. Firebase Resize Images
Firebase storage에 이미지를 저장할 때 자동으로 resize를 해준다. (다른 기능도 많음)
왼쪽 사진은 Resize를 통해서 Firebase Storage에 저장된 사진이고, 오른쪽 사진은 원본 사진입니다.
바이트 수가 적어진 걸 볼 수 있습니다. (지금은 안보이시겠지만 크기도 작아졌습니다.)
아래 사진은 웹에서 불러온 이미지입니다.
Firebase Console 들어가셔서 왼쪽 맨 하단에 Extensions가 있습니다.
아직 베타 서비스라 정식으로는 안 나와서 구석에 박혀있는데 쓸모 있는 기능 같습니다.
1. AWS처럼 지역 정하는 거
2. 어떤 Firebase storage에 넣을 건지 설정
3. 리사이즈 원하는 크기
4. 원본 데이터를 삭제하고 resize 할지 여부 (참일 경우 삭제)
- 저는 원본이 필요 없고 resize 된 것만 필요해서 true
5. 경로 설정? 필요 없어 보여서 패스
6. 이미지 캐시 크기 설정
후기
Firebase resize images 기능을 몰랐을 때...
저장한 이미지 크기가 큰 줄도 모르고, Firebase storage 전송 바이트가 급격하게 커져서 24시간 정지? 먹었었다.
어우 어떻게 하지 고민했었는데... 편리한 기능 덕분에 resize도 하고, 캐시 관리도 편해졌다.
캐싱 기능도 안 되는 줄 알고 어우 데이터 엄청 먹으면 어떻게 하지 했는데 크롬 개발자 도구에 Disable cache 기능을 켜놔서.... 안됬던 거였다..... 어우.... 멍청이 ㅠ
'Javascript > 토이프로젝트' 카테고리의 다른 글
2021년 상반기 토이 프로젝트 시작 - 회사 주변 맛집 리뷰 (0) | 2021.03.21 |
---|---|
웹 버전 관리 시스템 (0) | 2021.02.17 |
youtube search api 연동 (0) | 2020.01.09 |
프로젝트_v10 AWS에 작업물 업로드 + Nginx 연동 (0) | 2019.04.08 |
프로젝트_v9 AWS에 Nginx 설치해서 띄워보기 (0) | 2019.03.08 |