◎ 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)
'파이썬 Python' 카테고리의 다른 글
파이썬(Python) print 함수와 문자열 포맷으로 출력하기 (1) | 2024.09.01 |
---|---|
파이썬(Python) 2진수, 8진수, 10진수, 16진수 변환하기 (1) | 2024.08.29 |
파이썬(Python) OpenCV 파일 읽기와 저장하기 (1) | 2024.08.28 |
파이썬 Python Flask no module named xxxx 에러 해결하기 (0) | 2024.08.25 |
파이썬(Python) 설치 라이브러리 확인하기 (0) | 2024.08.24 |
파이썬(Python) PyQt5 QListWidget 고급, 데이터 옮기기 (0) | 2024.08.24 |
파이썬(Python) PyQt5 QListWidget 위젯 사용하기 (0) | 2024.08.22 |
파이썬(Python) str.format 문자열 형식화 하기 (0) | 2024.08.17 |