몰입공간
[MongoDB] GridFS 파일 업데이트 하는 방법 본문
#1. GridFS
기존의 mongoDB BSON 데이터의 자료 크기는 16MB로 제한하기 때문에 사진이나 동영상과 같은 미디어파일을
그대로 업로드 하기에 무리가 있었다.
이런 문제를 해결할 강력한 도구가 바로 GridFS이다.
Gridfs는 파일 형태의 자료를 서로 참조가 가능한 2개의 컬렉션으로 분리 저장한다.
파일의 용량을 255kb을 기준으로 여러개의 chunk형태로 DB에 저장하고 서버에서 파일을 조회할 때 chunk형태로
분리된 파일과 다른 컬렉션에 저장된 메타데이터 정보를 참조해 조합하여 내보낸다.
(사용자가 수정하지 않으면 자동으로 fs라는 bucket 이름을 붙인다.)
- fs.files : 업로드한 파일의 metadata를 저장
- fs.chunks: 파일을 binary 형태로 저장 (파일의 크기가 클 수록 여러개의 chunks로 분리하여 저장한다.)
#2. GridFS 초기화 및 파일 저장
GridFS를 사용하기 위해 먼저 DB정보와 함께 초기화를 진행한다.
## MongoDB 설정
ca = certifi.where()
client = MongoClient('mongodb+srv://space:-------@cluster0.gpjhq.mongodb.net/Cluster0?retryWrites=true&w=majority',
tlsCAFile=ca)
db = client.db-----
# gridfs 초기화
fs = gridfs.GridFS(db)
DB에 file을 추가하는 방법으로 put 메서드를 사용한다.
# 회원가입에서 프로필 이미지를 저장하는 경우
# ajax를 통해 POST방식으로 유저 인풋값을 formData 형식으로 받습니다.
if request.method == "POST":
```생략```
profile_img = request.files['profile_img']
# gridfs로 유저가 업로드한 프로필 이미지를 DB에 분할하여 저장합니다.
fs_image_id = fs.put(profile_img)
doc = {
"img": fs_image_id,
"description": "",
}
db.users.insert_one(doc)
put 메서드를 통해 GridFS로 파일을 DB에 저장하고 참조를 위해 users 콜렉션에 업로드한 파일의 id값을 삽입하였다.
#3. GridFS 파일 업데이트 하기
GridFS는 기본적으로 파일을 chunk 형태로 분할 저장하기 때문에 update나 overwrite를 할 수 없다.
때문에 파일을 바꾸고 싶다면 delete 메서드를 통해 파일을 삭제하고 업로드할 파일을 다시 저장해야 한다.
if "profile_img" in request.files :
print('exist')
# 파일의 id를 참조하여 삭제
fs.delete(user['img'])
profile_img = request.files['profile_img']
# 재업로드한 파일을 put메서드를 통해 DB 다시 저장
fs_image_id = fs.put(profile_img)
db.users.update_one({'id':user['id']},{'$set':'img':fs_image_id}})
파일 삭제는 저장한 파일의 id를 참조하여 삭제가 가능하다.
metadata와 chunks 데이터들이 서로 참조관계에 있기 때문에 모두 삭제가 된다.
이후 다시 파일을 put메서드를 통해 DB에 저장하면 업데이트가 가능하다.
#4. 참고
'Programming > Python' 카테고리의 다른 글
[Python] 제너레이터 (Generator) (0) | 2022.02.24 |
---|---|
[Poetry] VScode에서 Poetry 활용하기 (Using python poetry in VScode) (0) | 2022.02.10 |
[Python] boolean 값을 활용한 숫자 연산 (Calculations with bool) (0) | 2022.02.04 |
[Python] 자료형에 따른 함수 작용 (0) | 2021.12.24 |
[Pymongo] mongoDB 중복 데이터 제거하기 (0) | 2021.12.20 |