포도가게의 개발일지

Flask-mongoDB image upload & GridFS 본문

DB

Flask-mongoDB image upload & GridFS

grape.store 2021. 7. 21. 12:01
반응형

1. html에서 form형식으로 -> Flask로 image data(file 형식)을 보내줍니다.

form 형식을 이용한 router통신
1.action = 라우터 주소
2.input type = file
3.name = 보내줄 키 값

<form action="/upload" method="post" id="uploadForm" enctype="multipart/form-data">
            <label>이미지 첨부</label>
            <input type="file" name="image" class="form-control" placeholder="">
            <input type="submit" class="btn btn-primary btn_location" value="Submit">
</form>
@app.route("/upload", methods=['POST'])
def upload():
    img = request.files['image']
    print(img)
    return jsonify({'msg':'저장에 성공했습니다.'})

파일이 정상적으로 넘어온것을 확인 할 수 있다. 이제 이 data를 static 폴더에 저장하거나 mongoDB에 upload 해주어야 한다.

 

2. Flask -> mongo DB 로 파일 upload

from flask import Flask, request, render_template, jsonify
import gridfs

app = Flask(__name__)


from pymongo import MongoClient

client = MongoClient('localhost', 27017)

## mongodb 저장 경로 ##
db = client.cityclone

@app.route("/")
def main():
    return render_template('index.html')

@app.route("/upload", methods=['POST'])
def upload():
	## file upload ##
    img = request.files['image']
    
    ## GridFs를 통해 파일을 분할하여 DB에 저장하게 된다
    fs = gridfs.GridFS(db)
    fs.put(img, filename = 'name')
    
    ## file find ##
    data = client.grid_file.fs.files.find_one({'filename':'name'})
    
    ## file download ##
    my_id = data['_id']
    outputdata = fs.get(my_id).read()
    output = open('./images/'+'back.jpeg', 'wb')
    output.write(outputdata)
    return jsonify({'msg':'저장에 성공했습니다.'})

if __name__ == '__main__':
    app.run(debug=True)

3. GridFs란? 공부를 하면서 내용을 계속 추가할 예정

- 16mb를 넘는 사이즈의 데이터를 저장하고 조회하는 방식

- 또한, 한개의 파일로 저장하는 대신 부분이나 청크로 나누어 분리된 document를 청크로 저장한다. 청크사이즈는 기본 256kb로 제한됨

- 때문에, 파일 청크와 메타데이터를 저장하는 두개의 컬렉션을 사용한다.

- 파일 크기가 16MB보다 작 으면 GridFS를 사용하는 대신 단일 문서에 파일을 수동으로 저장하는 것이 좋다.

 

추가내용 : 현재 가장 많이 사용되는 방식으로 이미지는 db에는 url만 저장하며 img 서버를 따로 만들어 두어 db에서 받아온 url을 통해 접속하는 방식을 가장 많이 선호한다.

Comments