
◎ 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 |
녹두장군1님의
글이 좋았다면 응원을 보내주세요!