用Flask處理圖片非常容易,這一篇學(xué)習(xí)一下圖片的上傳、下載及展示。還是以實(shí)例代碼演示為主。
首先,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的上傳(過(guò)程中未做任何處理,只是為了演示)
點(diǎ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>
點(diǎn)擊提交信息后,通過(guò) http://localhost:5000/up_photo,傳遞到后臺(tái)對(duì)應(yīng)的路由處理,查看控制臺(tái):
后臺(tái)接收的路由代碼:
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 '上傳頭像成功,上傳的用戶(hù)是:'+username  return render_template('index.html')此時(shí),我們查看static/photo時(shí),已經(jīng)可以看到我們點(diǎn)擊上傳的圖片了。
以上是最簡(jiǎn)單的一個(gè)文件上傳示例,我們實(shí)際使用中基本不可能這樣去寫(xiě),通常會(huì)做一些處理。例如:上傳后做圖片名稱(chēng)唯一性的處理、限制上傳文件的類(lèi)型、無(wú)論上傳成功或者失敗,都去做一些返回提示等等。
限制上傳文件類(lèi)型,例如,我們希望用戶(hù)上傳的文件為圖片類(lèi)型
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename):  return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS上面的代碼片段通過(guò)截取上傳文件的后綴名,判斷是否是屬于我們期望用戶(hù)上傳的類(lèi)型。
更改上傳圖片名稱(chēng),防止重名
這里我們使用日期加隨機(jī)數(shù)生成圖片名,做一個(gè)生成字符串的工具類(lèi)
#-*-coding:utf-8-*-import datetimeimport randomclass Pic_str:  def create_uuid(self): #生成唯一的圖片的名稱(chēng)字符串,防止圖片顯示時(shí)的重名問(wèn)題    nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S"); # 生成當(dāng)前時(shí)間    randomNum = random.randint(0, 100); # 生成的隨機(jī)整數(shù)n,其中0<=n<=100    if randomNum <= 10:      randomNum = str(0) + str(randomNum);    uniqueNum = str(nowTime) + str(randomNum);    return uniqueNum;當(dāng)我們點(diǎn)擊圖片上傳,選擇圖片點(diǎn)擊提交后,頁(yè)面返回提示信息如下圖:
此時(shí)看我們工程下的upload文件夾,唯一名稱(chēng)的圖片已經(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 pythonfrom werkzeug.utils import secure_filenamefrom flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abortimport timeimport osfrom strUtil import Pic_strimport base64 app = Flask(__name__)UPLOAD_FOLDER = 'upload'app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDERbasedir = 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)基本示例就以上這些了!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注