Please Enable JavaScript!
Gon[ Enable JavaScript ]

파이썬(Python) Flask 이미지 서버에 올리기

파이썬 Python
반응형

 

1. 웹 페이지 만들기

 

이미지를 올리고 서버에 전송할 HTML 코드를 작성합니다. form 을 이용해서 POST 방식으로 추가한 이미지 파일을 전송할 것입니다. form 의 속성인 enctype multipart/form-data 를 사용합니다. form 에서 파일이나 이미지를 전송할 때 사용하는 속성값입니다. 이미지를 추가할 input 태그는 type=”file” 입니다. 바로 아래 send 버튼을 만들어서 POST 방식으로 전송합니다. 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Image Upload</title>
</head>
<body>
<form action="" method="post" enctype = "multipart/form-data">
   <div>
      <label >Add Image : </label>
      <input type="file" name="fileImage" id="fileImage"/>
   </div>
   <div>
      <input type="submit" id="send" name="send" value="send" />
   </div>
</form>
</body>
</html>

 

 

2.  Flask 서버 만들기

 

Flask route() 함수를 사용해서 이미지 저장 작업을 진행할 주소를 추가합니다. 라우터 생성 함수의 파라미터에 methods=[‘GET’, ‘POST’] 는 브라우저에서 호출하는 방식에 따라 GET/POST 방식을 구분하기 위해서 추가한 것입니다. 

# 웹 서버 메인
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import os
 
app = Flask(__name__)
image_path = './static/images/'
 
@app.route("/test", methods=['GET', 'POST'])
def index():
    pass
 
if __name__ == '__main__':
    app.run(debug=True)

 

request 객체의 method 속성으로 GET/POST 구분이 가능합니다. 웹 페이지에 처음 접속하면 GET 메소드로 호출하게 됩니다. 이때 html 페이지를 반환합니다. 

def index():
    if request.method == 'GET':
        return render_template('image_upload.html')
 
    if request.method == 'POST':
        # 이미지 업로드
        obj_file = request.files['fileImage']
        filename = secure_filename(obj_file.filename)
        os.makedirs(image_path, exist_ok=True)
        obj_file.save(os.path.join(image_path, filename))
   
        return render_template('image_upload.html')

 

 

3. 웹 페이지 전송 이미지 저장하기

 

웹 페이지에서 전송한 이미지를 저장하기 위한 첫 번째 단계는 HTML Input 박스에서 전송한 이미지를 request 로 받습니다

# 이미지 업로드
obj_file = request.files['fileImage']

 

secure_filename() 는 사용자의 입력으로 웹 페이지에서 전송한 파일의 위조 여부를 검사하는 함수입니다. 파일시스템에 직접 파일을 저장하기 전에 파일명을 보호하기 위해 항상 이 함수를 사용합니다. 

from werkzeug.utils import secure_filename

filename = secure_filename(obj_file.filename)

 

다음은 os.makedirs() 함수를 이용해서 폴더 존재 여부를 확인한 후 생성합니다. 매개변수로 exist_ok=True 를 입력합니다. 그리고 파일 객체인 FileStorage save() 함수로 이미지를 지정한 경로에 저장합니다. 

os.makedirs(image_path, exist_ok=True)
obj_file.save(os.path.join(image_path, filename))

 

전체 파이썬 소스는 다음과 같습니다.

# 웹 서버 메인
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import os
 
app = Flask(__name__)
image_path = './static/images/'
 
@app.route("/test", methods=['GET', 'POST'])
def index():
    try:
        if request.method == 'GET':
            return render_template('image_upload.html')
 
        if request.method == 'POST':
            # 이미지 업로드
            obj_file = request.files['fileImage']
            filename = secure_filename(obj_file.filename)
 
            os.makedirs(image_path, exist_ok=True)
            obj_file.save(os.path.join(image_path, filename))
            return render_template('image_upload.html')
 
    except Exception as e:
        # 모든 예외 처리, Exception을 사용
        print('Exception : ', e)

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

 

 

반응형
Posted by 녹두장군1
,