You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python实现文件存至文件系统并将路径存储到数据库(不使用Django)

不依赖Django实现Base64图片存储到文件系统+数据库方案

实现思路

先拆解原Django方案的核心逻辑,不依赖框架手动实现4个核心步骤即可:

  • 解析base64编码的图片内容并解码为二进制数据
  • 生成不重复的图片文件名,自动创建存储目录(目录不存在时)
  • 将二进制图片写入本地文件系统,得到文件存储路径
  • 把文件路径和其他业务字段一同写入数据库

完整实现代码

1. 图片存储工具函数(替换原Django版utils.py)

全部使用Python标准库实现,无需安装第三方依赖:

import base64
import uuid
import os

# 配置图片存储目录,和原Django的upload_to='charts'逻辑对应
IMAGE_SAVE_DIR = "./charts"

def get_report_image(base64_data):
    # 拆分base64头和实际编码内容
    _, img_content = base64_data.split(';base64, ')
    # 解码为二进制图片数据
    decoded_img = base64.b64decode(img_content)
    # 生成唯一文件名,和原逻辑一致取UUID前12位加png后缀
    img_name = f"{str(uuid.uuid4())[:12]}.png"
    # 存储目录不存在则自动创建
    if not os.path.exists(IMAGE_SAVE_DIR):
        os.makedirs(IMAGE_SAVE_DIR)
    # 拼接跨平台的完整存储路径
    save_path = os.path.join(IMAGE_SAVE_DIR, img_name)
    # 写入二进制数据到本地文件
    with open(save_path, "wb") as f:
        f.write(decoded_img)
    # 返回存储路径,用于后续存入数据库
    return save_path

2. 数据库操作示例(替换原Django ORM逻辑)

这里用Python自带的sqlite3做演示,无需额外安装数据库,你也可以替换为MySQL、PostgreSQL等其他数据库对应的驱动:

import sqlite3
from datetime import datetime

# 初始化数据库连接
conn = sqlite3.connect("your_database.db")
cursor = conn.cursor()

# 创建Report表,字段和你原Django模型完全对应
create_table_sql = """
CREATE TABLE IF NOT EXISTS report (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(120) NOT NULL,
    image VARCHAR(255),
    remarks TEXT NOT NULL,
    created DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated DATETIME DEFAULT CURRENT_TIMESTAMP,
    author_id INTEGER NOT NULL
)
"""
cursor.execute(create_table_sql)
conn.commit()

# 插入数据示例,对应原Report.objects.create逻辑
# 假设你拿到的base64编码图片存在变量base64_encoded_image中
img_save_path = get_report_image(base64_encoded_image)
insert_sql = """
INSERT INTO report (name, image, remarks, author_id, updated)
VALUES (?, ?, ?, ?, ?)
"""
current_time = datetime.now()
cursor.execute(insert_sql, (
    "report name",
    img_save_path,
    "Report Remarks",
    1,  # 替换为实际的用户ID,对应原来的request.user.id
    current_time
))
conn.commit()

# 操作完成关闭连接
cursor.close()
conn.close()

注意事项

  • 如果需要使用其他数据库,只需替换sqlite3为对应的驱动(比如pymysql对应MySQL),SQL语法基本通用,仅需微调字段类型
  • 可以根据需要添加异常捕获逻辑,比如base64格式校验、文件写入权限判断、数据库操作异常回滚等
  • 生产环境建议配置合理的存储路径,避免目录权限问题

内容的提问来源于stack exchange,提问作者KHAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:04