Flask 이미지 업로드,다운로드 및 예시 코드 구현

Flask 로 그림 을 처리 하 는 것 은 매우 쉽다.이 편 은 그림 의 업로드,다운로드 와 전 시 를 배 워 보 자.아니면 인 스 턴 스 코드 프 리 젠 테 이 션 위주 로?
우선,간단 한 업 로드 를 실현 합 니 다.
클릭 하여 그림 선택,이사 입력:

HTML 코드:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
  <body>
    <div>
      <form method="post" action="http://localhost:5000/up_photo" enctype="multipart/form-data">
      <input type="file" size="30" name="photo"/>
      <br>
      <input type="text" class="txt_input" name="name" style="margin-top:15px;"/>
      <input type="submit" value="    " class="button-new" style="margin-top:15px;"/>
      </form>
    </div>
  </body>
</html>
클릭 하여 정보 제출 후 통과http://localhost:5000/up_photo,배경 에 전달 되 는 경로 처리,콘 솔 보기:

배경 에서 받 은 경로 코드:

basedir = os.path.abspath(os.path.dirname(__file__))
 
@app.route('/up_photo', methods=['post'])
def up_photo():
  img = request.files.get('txt_photo')
  username = request.form.get("name")
  path = basedir+"/static/photo/"
  file_path = path+img.filename
  img.save(file_path)
  print '      ,      :'+username
  return render_template('index.html')
이때,우 리 는 static/photo 를 볼 때,이미 우리 가 클릭 하여 올 린 그림 을 볼 수 있다.
이상 은 가장 간단 한 파일 업로드 예제 입 니 다.우 리 는 실제 사용 에서 이렇게 쓸 수 없고 보통 처 리 를 합 니 다.예 를 들 어 업로드 후 이미지 이름 의 유일한 처리,업로드 파일 의 유형 제한,업로드 성공 이나 실패 에 관 계 없 이 반환 알림 을 하 는 등 이다.
업로드 파일 형식 을 제한 합 니 다.예 를 들 어 사용자 가 업로드 하 기 를 원 하 는 파일 은 그림 형식 입 니 다.

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF'])
 
def allowed_file(filename):
  return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
위의 코드 세 션 은 업로드 파일 의 접미사 이름 을 캡 처 하여 사용자 가 업로드 하 기 를 원 하 는 형식 인지 판단 합 니 다.
업로드 그림 이름 변경,이름 변경 방지
여기 서 우 리 는 날짜 에 무 작위 로 그림 이름 을 만 들 고 문자열 을 만 드 는 도구 클래스 를 만 듭 니 다.

#-*-coding:utf-8-*-
import datetime
import random
class Pic_str:
  def create_uuid(self): #             ,            
    nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S"); #       
    randomNum = random.randint(0, 100); #        n,  0<=n<=100
    if randomNum <= 10:
      randomNum = str(0) + str(randomNum);
    uniqueNum = str(nowTime) + str(randomNum);
    return uniqueNum;
우리 가 사진 업 로드 를 클릭 하고 사진 을 선택 하여 제출 을 클릭 하면 페이지 는 다음 그림 과 같은 알림 정 보 를 되 돌려 줍 니 다.

이 때 우리 프로젝트 의 upload 폴 더 를 보면 유일한 이름 의 그림 이 업로드 되 었 습 니 다.

사진 다운로드

@app.route('/download/<string:filename>', methods=['GET'])
def download(filename):
  if request.method == "GET":
    if os.path.isfile(os.path.join('upload', filename)):
      return send_from_directory('upload', filename, as_attachment=True)
    pass
그림 의 전시

# show photo
@app.route('/show/<string:filename>', methods=['GET'])
def show_photo(filename):
  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])
  if request.method == 'GET':
    if filename is None:
      pass
    else:
      image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()
      response = make_response(image_data)
      response.headers['Content-Type'] = 'image/png'
      return response
  else:
    pass
전체 예제 코드

#encoding:utf-8
#!/usr/bin/env python
from werkzeug.utils import secure_filename
from flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abort
import time
import os
from strUtil import Pic_str
import base64
 
app = Flask(__name__)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = os.path.abspath(os.path.dirname(__file__))
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF'])
 
def allowed_file(filename):
  return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
 
 
@app.route('/upload')
def upload_test():
  return render_template('up.html')
 
 
#     
@app.route('/up_photo', methods=['POST'], strict_slashes=False)
def api_upload():
  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])
  if not os.path.exists(file_dir):
    os.makedirs(file_dir)
  f = request.files['photo']
  if f and allowed_file(f.filename):
    fname = secure_filename(f.filename)
    print fname
    ext = fname.rsplit('.', 1)[1]
    new_filename = Pic_str().create_uuid() + '.' + ext
    f.save(os.path.join(file_dir, new_filename))
 
    return jsonify({"success": 0, "msg": "    "})
  else:
    return jsonify({"error": 1001, "msg": "    "})
 
@app.route('/download/<string:filename>', methods=['GET'])
def download(filename):
  if request.method == "GET":
    if os.path.isfile(os.path.join('upload', filename)):
      return send_from_directory('upload', filename, as_attachment=True)
    pass
  
  
# show photo
@app.route('/show/<string:filename>', methods=['GET'])
def show_photo(filename):
  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])
  if request.method == 'GET':
    if filename is None:
      pass
    else:
      image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()
      response = make_response(image_data)
      response.headers['Content-Type'] = 'image/png'
      return response
  else:
    pass
 
 
if __name__ == '__main__':
  app.run(debug=True)
기본 예 는 이상 입 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기