现在有一个需求,请把在数据库中以longblob形式存储的文件在后端写一个接口,传递给前端并且还接入kkfileview进行前端预览功能,请帮我实现相关的代码逻辑
时间: 2024-03-16 11:45:34 浏览: 90
好的,根据你的需求,我可以给你提供一份参考代码,你可以根据需要进行修改和完善。以下是后端和前端的代码:
后端代码:
```python
from flask import Flask, jsonify, request, send_file
import pymysql.cursors
app = Flask(__name__)
# 数据库连接信息
db_host = 'localhost'
db_port = 3306
db_user = 'root'
db_password = 'password'
db_name = 'test'
# 获取数据库连接
def get_db_conn():
conn = pymysql.connect(host=db_host,
port=db_port,
user=db_user,
password=db_password,
db=db_name,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
return conn
# 获取文件数据
@app.route('/get_file_data', methods=['GET'])
def get_file_data():
conn = get_db_conn()
try:
with conn.cursor() as cursor:
# 获取文件数据
sql = 'SELECT file_data FROM file_table WHERE file_id=%s'
cursor.execute(sql, (request.args.get('file_id')))
result = cursor.fetchone()
if result:
# 返回文件数据
return send_file(result['file_data'], attachment_filename='file.pdf')
else:
return jsonify({'status': 'fail', 'msg': 'file not found'})
except Exception as e:
print(e)
return jsonify({'status': 'fail', 'msg': 'get file data error'})
finally:
conn.close()
# 获取文件预览数据
@app.route('/get_file_preview_data', methods=['GET'])
def get_file_preview_data():
conn = get_db_conn()
try:
with conn.cursor() as cursor:
# 获取文件数据
sql = 'SELECT file_data FROM file_table WHERE file_id=%s'
cursor.execute(sql, (request.args.get('file_id')))
result = cursor.fetchone()
if result:
# 返回文件预览数据
return send_file(result['file_data'], attachment_filename='file.pdf', as_attachment=False)
else:
return jsonify({'status': 'fail', 'msg': 'file not found'})
except Exception as e:
print(e)
return jsonify({'status': 'fail', 'msg': 'get file preview data error'})
finally:
conn.close()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
```
前端代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>KkFileView Demo</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kkfileview@1.0.3/dist/kkfileview.min.css">
</head>
<body>
<div id="viewer"></div>
<script src="https://cdn.jsdelivr.net/npm/jquery"></script>
<script src="https://cdn.jsdelivr.net/npm/kkfileview@1.0.3/dist/kkfileview.min.js"></script>
<script>
$(function () {
var fileId = '1'; // 文件ID
var fileType = 'pdf'; // 文件类型
var url = 'http://localhost:5000/get_file_preview_data?file_id=' + fileId; // 获取文件预览数据的接口URL
var options = {
fileType: fileType,
url: url
};
KKFileView('#viewer', options);
});
</script>
</body>
</html>
```
其中,后端代码中的 `file_table` 表需要包含 `file_id` 和 `file_data` 两个字段,`file_data` 以 `longblob` 形式存储文件数据。
需要注意的是,为了保证文件能够被正确预览,前端需要引入 `kkfileview` 库,并且需要根据文件类型设置 `fileType` 参数。另外,前端需要通过接口获取后端返回的文件预览数据,并将其传递给 `kkfileview` 进行预览。
阅读全文