把文件上传到数据库中是常见操作,特别是在需要存储文件元数据、小文件或者需要和文件相关的业务逻辑紧密集成场景中。下面分享常用到的文件传输到数据库中的方法。
文件内容可以直接通过二进制数据存储到数据库中。这种方式常用于存储小文件或需频繁访问的文档。现在前端上传好文件,用HTML表单或AJAX把文件发送到后端服务器:
<form method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file" />
<button type="submit">上传</button>
</form>
后端接收文件后,把其读取为二进制数据如:
from flask import Flask, request
import sqlite3
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
file_data = file.read() # 读取文件内容为二进制数据
file_name = file.filename
# 连接数据库并插入数据
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
data BLOB
)
''')
cursor.execute('INSERT INTO files (name, data) VALUES (?, ?)', (file_name, file_data))
conn.commit()
conn.close()
return "文件上传成功!"
if __name__ == '__main__':
app.run(debug=True)
再将文件名和内存存储到数据库中,如数据库表结构为:
CREATE TABLE files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
data BLOB
);
这类方式是把文件直接存于数据库,便于管理,需要时可以直接从数据库中读取到文件。但是不适用于大文件,会占用过多空间影响性能。
把文件存储到文件系统同时把文件路径、元数据等信息存储到数据库中,这种方式可以用于大文件或高性能存储中。先同上步一样在前端上传文件,然后在后端接收文件后把文件存于服务器文件系统如:
from flask import Flask, request
import os
import sqlite3
app = Flask(__name__)
UPLOAD_FOLDER = '/path/to/upload'
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
file_path = os.path.join(UPLOAD_FOLDER, file.filename)
file.save(file_path) # 将文件保存到文件系统
# 将文件路径存储到数据库
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
path TEXT
)
''')
cursor.execute('INSERT INTO files (name, path) VALUES (?, ?)', (file.filename, file_path))
conn.commit()
conn.close()
return "文件上传成功!"
if __name__ == '__main__':
app.run(debug=True)
存储的数据库表结构:
CREATE TABLE files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
path TEXT
);
这种方式不容易因为文件内容而膨胀,常常用于大文件存储。但是文件存储和存储库分离,管理起来更麻烦还要额外处理文件备份及同步。
使用对象存储服务,这种方式是把文件上传到云存储服务中,且把文件的元数据存储到数据库中,也可用于需要高可用性及扩展性的应用场景中。在前端上传好文件后,使用云存储的SD把文件存于对象存储服务中,再把存储文件元数据存储到数据库中。还可以应用分布式文件系统,这种方式适合高并发和分布式存储,大规模文件存储的常用方法。