Flask實現(xiàn)圖片的上傳、下載及展示示例代碼
用Flask處理圖片非常容易,這一篇學習一下圖片的上傳、下載及展示。還是以實例代碼演示為主。
首先,實現(xiàn)一個簡單的上傳(過程中未做任何處理,只是為了演示)
點擊選擇圖片,輸入李四:
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時,已經(jīng)可以看到我們點擊上傳的圖片了。
以上是最簡單的一個文件上傳示例,我們實際使用中基本不可能這樣去寫,通常會做一些處理。例如:上傳后做圖片名稱唯一性的處理、限制上傳文件的類型、無論上傳成功或者失敗,都去做一些返回提示等等。
限制上傳文件類型,例如,我們希望用戶上傳的文件為圖片類型
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
上面的代碼片段通過截取上傳文件的后綴名,判斷是否是屬于我們期望用戶上傳的類型。
更改上傳圖片名稱,防止重名
這里我們使用日期加隨機數(shù)生成圖片名,做一個生成字符串的工具類
#-*-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); # 生成的隨機整數(shù)n,其中0<=n<=100 if randomNum <= 10: randomNum = str(0) + str(randomNum); uniqueNum = str(nowTime) + str(randomNum); return uniqueNum;
當我們點擊圖片上傳,選擇圖片點擊提交后,頁面返回提示信息如下圖:
此時看我們工程下的upload文件夾,唯一名稱的圖片已經(jīng)上傳成功
圖片的下載
@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)
基本示例就以上這些了!
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python matplotlib實現(xiàn)雙Y軸的實例
今天小編就為大家分享一篇python matplotlib實現(xiàn)雙Y軸的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python中tkinter無法同時顯示多個image的解決方法及pack與place解析
這篇文章主要介紹了Python中tkinter無法同時顯示多個image的解決方法及pack與place解析,本文給大家分享問題原因解析及解決方案,需要的朋友可以參考下2023-02-02python利用appium實現(xiàn)手機APP自動化的示例
這篇文章主要介紹了python利用appium實現(xiàn)手機APP自動化的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法
今天小編就為大家分享一篇numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08