flask上传图片上传文件

flask上传图片上传文件

1.导入
要从
要获取到系统其他的文件导入os库
导入时间库 用后来的时间命名

先把第一次写的代码都放上来(我会一一讲解,后面还有完善)

from datetime import datetime
from flask import Flask, request, jsonify
import os
import random
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
@app.route("/upload", methods=["POST"])
def upload():
    f = request.files.get('file')       # 获取前端传给我的文件

    # 生成随机数
    random_num = random.randint(0, 100)
    # f.filename.rsplit('.', 1)[1] 获取文件的后缀

    filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + f.filename.rsplit('.', 1)[1]

    file_path = basedir + "/static/file/" + filename    # basedir 代表获取当前位置的绝对路径
    f.save(file_path)  # 把图片保存到static 中的file 文件名


    # 可以配置生成对应的外网访问的链接
    my_host = "http://127.0.0.1:5000"
    new_path_file = my_host + "/static/file/" + filename
    data = {"msg": "success", "url": new_path_file}
    payload = jsonify(data)
    return payload, 200


if __name__ == '__main__':
    app.run()

2.获取系统的绝对位置

basedir = os.path.abspath(os.path.dirname(__file__))

如图
在这里插入图片描述
获取到的是我 上传图片.py 这个文件所在的绝对路径 赋值给basedir

3.保存文件的绝对位置为什么要加/static/file/
在这里插入图片描述
因为在Flask 注册里面我们点击ctrl+鼠标左键

app = Flask(__name__)

点进来可以看到

def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder="static",
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder="templates",
        instance_path=None,
        instance_relative_config=False,
        root_path=None,
    ):

可以看到有个有个flask,可以理解为把static这个文件夹注册成可以直接使用的文件夹这个文件夹命名为static,我们可以创一个文件夹 ,就命名为static,再在这个文件夹下面创一个file文件
在这里插入图片描述

4.获取图片的名字
防止一张图片我们用两次,第二次图片把第一次图片覆盖,我就导入时间生成随机数来命名

 # f.filename.rsplit('.', 1)[1] 获取文件的后缀

    filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + f.filename.rsplit('.', 1)[1]

5.把图片保存到static下的的file文件

file_path = basedir + "/static/file/" + filename    # basedir 代表获取当前位置的绝对路径
    f.save(file_path)  # 把图片保存到static 中的file 文件名

6.配置成对应的外网访问的链接

my_host = "http://127.0.0.1:5000"
    new_path_file = my_host + "/static/file/" + filename
    data = {"msg": "success", "url": new_path_file}
    payload = jsonify(data)
    return payload, 200

7.用postman检测端口
在这里插入图片描述
复制网址到浏览器打开可以看到图片,file文件下也会生成对应的jpg文件
在这里插入图片描述
但是这种方法上传有一种弊端 有的上传png格式的文件不行
在这里插入图片描述
我的没出bug,一般出bug的话一般是是url最后面多个双引号,这种一般是后缀除了问题,可以导入

from werkzeug.utils import secure_filename # 从这个工具里面导入安全工作名来判断安全文件名是否正确

编写

# 获取安全的文件名 正常文件名
    filename = secure_filename(f.filename)

把这里改成

filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + filename.rsplit('.', 1)[1]

8.上传多张图片的方法
files = request.files.getlist(‘file’)
然后就可以通过for循环列表提取到对应的图片进行重命名之类的操作
到响应返回给前端信息的时候,把多张图片对应的地址放进一个列表里面返回给前端了,前端再通过展示将多张图片展示出来了

9.程序完整代码

from datetime import datetime
from flask import Flask, request, jsonify
import os
import random
from werkzeug.utils import secure_filename # 从这个工具里面导入安全工作名来判断安全文件名是否正确




# 获取当前位置的绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)




@app.route("/upload", methods=["POST"])
def upload():
    f = request.files.get('file')       # 获取前端传给我的文件
    # 获取安全的文件名 正常文件名
    filename = secure_filename(f.filename)

    # 生成随机数
    random_num = random.randint(0, 100)
    # f.filename.rsplit('.', 1)[1] 获取文件的后缀

    filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + filename.rsplit('.', 1)[1]

    file_path = basedir + "/static/file/" + filename    # basedir 代表获取当前位置的绝对路径
    f.save(file_path)  # 把图片保存到static 中的file 文件名


    # 可以配置生成对应的外网访问的链接
    my_host = "http://127.0.0.1:5000"
    new_path_file = my_host + "/static/file/" + filename
    data = {"msg": "success", "url": new_path_file}
    payload = jsonify(data)
    return payload, 200


if __name__ == '__main__':
    app.run()


当然也可以上传其他文件

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值