flask上传图片上传文件

1.导入

python 表单上传图片 python flask上传图片_python


要获取到系统其他的文件导入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__))

如图

python 表单上传图片 python flask上传图片_python 表单上传图片_02


获取到的是我 上传图片.py 这个文件所在的绝对路径 赋值给basedir3.保存文件的绝对位置为什么要加/static/file/

python 表单上传图片 python flask上传图片_sed_03


因为在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文件

python 表单上传图片 python flask上传图片_sed_04

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检测端口

python 表单上传图片 python flask上传图片_flask_05


复制网址到浏览器打开可以看到图片,file文件下也会生成对应的jpg文件

python 表单上传图片 python flask上传图片_python 表单上传图片_06


但是这种方法上传有一种弊端 有的上传png格式的文件不行

python 表单上传图片 python flask上传图片_sed_07


我的没出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()

当然也可以上传其他文件