项目配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os

class Config(object):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/day08'
SQLALCHEMY_TRACK_MODIFICATIONS = False # 构建项目所在的 绝对路径,也就是 day08 的绝对路径
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
# 静态资源存放路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# 自定义的 图片上传路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

图片上传与展示

static静态资源方式

采用此种方式:

  • 创建APP时,一定要指明静态资源的路径
  • 然后在上传图片时,将上传的图片存放到上一步指明的静态资源路径中
  • 就可以使用static内置的服务,展示图片资源

app创建

创建app时,指明静态资源目录

1
app = Flask(__name__, static_folder=Config.STATIC_ROOT, static_url_path='/static')
  • static_folder: 静态资源路径
  • static_url_path: 静态资源展示的url前缀

图片上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os

from uuid import uuid4
from flask_restful import Resource, reqparse
from werkzeug.datastructures import FileStorage from app.config import Config
from .models import * def img_upload(img):
if not img:
return None # 将图片名按照 . 进行切分, 找到最后一个元素,也就是 文件的后缀名
end_name = img.filename.rsplit('.')[-1] # 通过文件的后缀名判断 身份为 合法的 图片
if end_name not in ['jpg', 'png', 'gif', 'jpeg']:
return None filename = str(uuid4()) + '.' + end_name # 为了生成一个不重复的 文件名
img_path = os.path.join(Config.STATIC_ROOT, filename) # 将路径和文件名拼接在一起,方便保存文件 img.save(img_path) # 将图片对象保存到 本地 return filename class NewsView(Resource):
def post(self):
# 1. 创建解析参数的对象
parser = reqparse.RequestParser()
# 2. 指明需要解析的参数
parser.add_argument('title', type=str, location='form', required=True)
parser.add_argument('img', type=FileStorage, location='files') # 3. 获取具体的参数
args = parser.parse_args() title = args.get('title')
img = args.get('img') # 利用自定义函数,将图片保存到本地
filename = img_upload(img) # 4. 创建对象, 注意:图片存储的只是 从media之后的 图片路径
news = News(title=title, img=filename)
# 5. 添加到 事务中
db.session.add(news)
# 6. 提交事务
try:
db.session.commit()
except:
return {
'msg': '添加失败'
}, 500
# 7. 返回响应
return {
'id': news.id,
'title': news.title,
'img': news.img
}, 201

图片访问

通过 http://127.0.0.1:5000/static/filename就可以访问图片

  • static是app创建时,配置的url前缀

自定义方式

自定义方式实现:

  • app创建时,不需要指明静态资源有关的任何参数
  • 图片的存放路径,可以是 任何一个合适的路径
  • 展示图片时,需要自己定义视图和路由,实现图片展示

图片上传

和上面的图片上传的流程一样,只是 图片存放的路径可以自由指定,不必一定存放到 某个特定路径

图片访问

图片访问时,可以自己读取文件内容,也可以调用flask内置的 方法,返回响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
from flask import make_response
from app.config import Config class ImgView(Resource):
def get(self, filename):
# 1. 拼接除图片的完成路径
img_path = os.path.join(Config.MEDIA_ROOT, filename) # 2. 按照二进制方式打开文件,读到的内容为 二进制文件流,方便接下来的网络传输
try:
with open(img_path, 'rb') as f:
img = f.read()
except FileNotFoundError:
return None, 404 # 3. 自定义响应
resp = make_response(img)
# 4. 声明响应体的类型 为 图片
resp.headers['Content-Type'] = 'image/png'
# 5. 返回响应
return resp
1
2
3
4
5
6
7
8
9
10
11
12
13
import os
from flask import send_from_directory from app.config import Config class ImgView(Resource):
def get(self, filename):
return send_from_directory(Config.MEDIA_ROOT, filename)

通过 http://127.0.0.1:5000/media/filename就可以访问图片

  • media是自己配置的路由前缀

flask 之上传本地图片的更多相关文章

  1. KindEditor上传本地图片在ASP.NET MVC的配置

    http://www.cnblogs.com/upupto/archive/2010/08/24/1807202.html 本文解决KindEditor上传本地图片在ASP.NET MVC中的配置. ...

  2. .net mvc4 利用 kindeditor 上传本地图片

    http://blog.csdn.net/ycwol/article/details/41824371?utm_source=tuicool&utm_medium=referral 最近在用k ...

  3. tinymce4.x 上传本地图片(自己写个插件)

    tinymce是一款挺不错的html文本编辑器.但是添加图片是直接添加链接,不能直接选择本地图片. 下面我写了一个插件用于直接上传本地图片. 在tinymce的plugins目录下新建一个upload ...

  4. tinymce4.x 上传本地图片 (转载)

    转载自:http://www.cnblogs.com/fhen/p/5809514.html tinymce4.x 上传本地图片   tinymce是一款挺不错的html文本编辑器.但是添加图片是直接 ...

  5. html5上传本地图片,在线预览及裁剪(filereader,canvas)

    1 我们常常需要上传头像,点击上传按钮时候需要预览一下,使用filereader方法无需和后台交互,代码如下: //本地图片在上传之前的预览效果 //图片上传预览 function previewIm ...

  6. Java企业微信开发_07_素材管理之上传本地临时素材文件

    一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...

  7. js上传本地图片遇到的问题

    1.改变页面文件上传默认的样式 <input type="text" size="20" id="upfile" style=&quo ...

  8. 图片上传-本地图片转base64+ie8支持+本地预览支持

    最近项目由于flash同学没在了,图片上传只能前端重新做,后台希望用base64数据上传,复用之前接口 问题来了, 1.ie8 不支持canvas转base64 2.本地预览 base64数据,ie8 ...

  9. Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器

    一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要 ...

随机推荐

  1. 动环监控系统中B接口的实现

    动环监控系统简述 1.术语介绍 1.1 省集中监控中心-Province Supervision Center(PSC) 面向多FSU管理的高级监控层次,即省集中监控中心,通过开放的数据协议,连接监控 ...

  2. nRF52832蓝牙iBeacon广播

    开发环境 SDK版本:nRF5_SDK_15.0.0 芯片:nRF52832-QFAA 蓝牙iBeacon实现 iBeacon的核心就是广播,不需要进行连接,通过在广播包中插入信息然后广播出去. 广播 ...

  3. VUE002. 动态使用webpack打包处理后的静态图片路径({ img: require('xxx.png') })

    案例摘要 需求是通过v-for循环渲染数组中数据,其中包括本地包的图片文件.话不多说直接上代码: <a-radio-group class="template-radio"& ...

  4. 随机生成uuid序号

    function guid() { function S4() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); ...

  5. CommonsCollections3 反序列化利用链分析

    InstantiateTransformer commons-collections 3.1 中有 InstantiateTransformer 这么一个类,这个类也实现了 Transformer的t ...

  6. C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式

    C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...

  7. mybatis一对一联表查询的两种常见方式

    1.一条语句执行查询(代码如下图)  注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...

  8. 【PHP数据结构】PHP数据结构及算法总结

    断断续续地把这个系列写完了,就像上一个设计模式一样,算法这个系列也是前前后后写了将近有一年的时间.当然,都是在业余或者晚上的时间写完的,所以进度如此地慢.更主要的是,既然要写,总得要自己先弄懂吧,对于 ...

  9. mysql 选取操作日志(mysql-bin.0000恢复数据)

    my.ini 配置log-bin=mysql-bin 启用日志 用  mysql-bin.0000 mysqlbinlog -d keyboard ../data/mysql-bin.000024 – ...

  10. 第一次接触linux系统的你,必须要知道的概念

    linux系统一切皆为文件 linux系统一个多用户系统 没有消息就是好消息 linux系统目录结构 Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用"/"表示 ...