用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。

首先,实现一个简单的上传(过程中未做任何处理,只是为了演示)
 

点击选择图片,输入李四:

flask怎么把png图片存入MySQL中 flask实现图片上传_sed

HTML代码:

1.  
2.  
<html lang="en">
3.  
<head>
4.  
<meta charset="UTF-8">
5.  
<title>Title</title>
6.  
</head>
7.  
<body>
8.  
<div>
9.  
<form method="post" action="http://localhost:5000/up_photo" enctype="multipart/form-data">
10.  
<input type="file" size="30" name="photo"/>
11.  
<br>
12.  
<input type="text" class="txt_input" name="name" style="margin-top:15px;"/>
13.  
<input type="submit" value="提交信息" class="button-new" style="margin-top:15px;"/>
14.  
</form>
15.  
</div>
16.  
</body>
17.  
</html>

 

点击提交信息后,通过 http://localhost:5000/up_photo,传递到后台对应的路由处理,查看控制台:

flask怎么把png图片存入MySQL中 flask实现图片上传_html_02

 

后台接收的路由代码:

1.  
2.   
3.  
@app.route('/up_photo', methods=['post'])
4.  
def up_photo():
5.  
'txt_photo')
6.  
"name")
7.  
"/static/photo/"
8.  
    file_path = path+img.filename
9.  
    img.save(file_path)
10.  
print '上传头像成功,上传的用户是:'+username
11.  
return render_template('index.html')

此时,我们查看static/photo时,已经可以看到我们点击上传的图片了。

以上是最简单的一个文件上传示例,我们实际使用中基本不可能这样去写,通常会做一些处理。例如:上传后做图片名称唯一性的处理、限制上传文件的类型、无论上传成功或者失败,都去做一些返回提示等等。
 

 

限制上传文件类型,例如,我们希望用户上传的文件为图片类型

1.  
2.   
3.  
def allowed_file(filename):
4.  
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

上面的代码片段通过截取上传文件的后缀名,判断是否是属于我们期望用户上传的类型。
 

 

更改上传图片名称,防止重名

 

这里我们使用日期加随机数生成图片名,做一个生成字符串的工具类

 

1.  
2.  
import datetime
3.  
import random
4.  
class Pic_str:
5.  
def create_uuid(self): #生成唯一的图片的名称字符串,防止图片显示时的重名问题
6.  
"%Y%m%d%H%M%S");  # 生成当前时间
7.  
0, 100);  # 生成的随机整数n,其中0<=n<=100
8.  
if randomNum <= 10:
9.  
0) + str(randomNum);
10.  
        uniqueNum = str(nowTime) + str(randomNum);
11.  
return uniqueNum;

 

当我们点击图片上传,选择图片点击提交后,页面返回提示信息如下图:

flask怎么把png图片存入MySQL中 flask实现图片上传_上传_03

 

此时看我们工程下的upload文件夹,唯一名称的图片已经上传成功

flask怎么把png图片存入MySQL中 flask实现图片上传_上传_04

 

图片的下载

1.  
2.  
def download(filename):
3.  
if request.method == "GET":
4.  
if os.path.isfile(os.path.join('upload', filename)):
5.  
return send_from_directory('upload', filename, as_attachment=True)
6.  
pass

 

图片的展示


1.  
2.  
@app.route('/show/<string:filename>', methods=['GET'])
3.  
def show_photo(filename):
4.  
'UPLOAD_FOLDER'])
5.  
if request.method == 'GET':
6.  
if filename is None:
7.  
pass
8.  
else:
9.  
'%s' % filename), "rb").read()
10.  
            response = make_response(image_data)
11.  
'Content-Type'] = 'image/png'
12.  
return response
13.  
else:
14.  
pass

 

完整示例代码

1.  
#!/usr/bin/env python
2.  
from werkzeug.utils import secure_filename
3.  
from flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abort
4.  
import time
5.  
import os
6.  
from strUtil import Pic_str
7.  
import base64
8.   
9.  
app = Flask(__name__)
10.  
UPLOAD_FOLDER = 'upload'
11.  
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
12.  
basedir = os.path.abspath(os.path.dirname(__file__))
13.  
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF'])
14.   
15.  
def allowed_file(filename):
16.  
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
17.   
18.   
19.  
@app.route('/upload')
20.  
def upload_test():
21.  
return render_template('up.html')
22.   
23.   
24.  
# 上传文件
25.  
@app.route('/up_photo', methods=['POST'], strict_slashes=False)
26.  
def api_upload():
27.  
'UPLOAD_FOLDER'])
28.  
if not os.path.exists(file_dir):
29.  
        os.makedirs(file_dir)
30.  
'photo']
31.  
if f and allowed_file(f.filename):
32.  
        fname = secure_filename(f.filename)
33.  
print fname
34.  
'.', 1)[1]
35.  
'.' + ext
36.  
        f.save(os.path.join(file_dir, new_filename))
37.   
38.  
return jsonify({"success": 0, "msg": "上传成功"})
39.  
else:
40.  
return jsonify({"error": 1001, "msg": "上传失败"})
41.   
42.  
@app.route('/download/<string:filename>', methods=['GET'])
43.  
def download(filename):
44.  
if request.method == "GET":
45.  
if os.path.isfile(os.path.join('upload', filename)):
46.  
return send_from_directory('upload', filename, as_attachment=True)
47.  
pass
48.   
49.   
50.  
# show photo
51.  
@app.route('/show/<string:filename>', methods=['GET'])
52.  
def show_photo(filename):
53.  
'UPLOAD_FOLDER'])
54.  
if request.method == 'GET':
55.  
if filename is None:
56.  
pass
57.  
else:
58.  
'%s' % filename), "rb").read()
59.  
            response = make_response(image_data)
60.  
'Content-Type'] = 'image/png'
61.  
return response
62.  
else:
63.  
pass
64.   
65.   
66.  
if __name__ == '__main__':
67.  
True)

基本示例就以上这些了!