项目配置

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. 【CSS】模仿迅雷主页的按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Linux常用命令 - more命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 每次显 ...

  3. 学了这么多年C语言,你真的知道全局变量,局部变量,静态变量,本地函数,外部函数是如何区分标识的吗?

    动态库内容分析 文章目录 动态库内容分析 1. 动态库编译 1.1 第一个C文件:basic.c 1.2第二个C文件:demo.c 1.3第三个C文件:main.c 2.动态库编译 3.二进制内容分析 ...

  4. Markdown主要语法及使用

    最近,我发现使用Markdown这一标记语言的人越来越多了,我也去试了一下,感觉确实在编辑文档上方便了很多.于是我将一些关于Markdown的语法和编写时的快捷键整理在这里,方便以后查阅,也欢迎评论区 ...

  5. systemctl添加自定义系统服务

    [Service] Type=forking ExecStart=绝对路径 ExecStop=绝对路径 ExecReload=绝对路径 以上最精简版,文件/usr/lib/systemd/system ...

  6. 使用GitHub Pages + docsify快速搭建一个站点

    话不多说,先看效果: https://bytesfly.github.io/blog 为什么需要一个站点 肯定有人会问,既然有类似 博客园 这样优秀的平台来写博客,为什么还需要自己搭建站点呢? 放在G ...

  7. 网络前置任务(Pretext task)和下游任务(downstream tasks)

    Pretext task 可以理解为是一种为达到特定训练任务而设计的间接任务. 比如,要训练一个网络来对 ImageNet 分类,可以表达为 $f_{\theta}(x): x \rightarrow ...

  8. Catch That Cow----BFS

    Catch That Cow Description 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<= ...

  9. VBox 虚拟机安装 Openwrt 做旁路由

    VBox 虚拟机安装 Openwrt 做旁路由 需求:开个虚拟机做旁路由,电脑把网关设置成旁路由地址,用它跑个上网或其他什么东西. 安装及配置过程简述 这件事流程很简单,总结起来主要有以下几点: 安装 ...

  10. PHP的HTTP验证

    在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录.但其实 HTTP 也提供了这种登录验证机制,我们今天就来学习关于 HTT ...