用Flask處理圖片非常容易,這一篇學習一下圖片的上傳、下載及展示。還是以實例代碼演示為主。
首先,實現一個簡單的上傳(過程中未做任何處理,只是為了演示)
點擊選擇圖片,輸入李四:
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__))
-
-
-
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文件夾,唯一名稱的圖片已經上傳成功
圖片的下載
-
-
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
-
-
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
-
-
-
-
def upload_test():
-
return render_template('up.html')
-
-
-
# 上傳文件
-
-
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": "上傳失敗"})
-
-
-
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
-
-
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)
基本示例就以上這些了!
原文章地址:https://blog.csdn.net/weixin_36380516/article/details/80347192