python 生成二维码,本地服务器上传数据,直接运行就能用
uploadpdf.py
from flask import Flask, request, redirect, url_for,abort,send_from_directory
import mysql.connector
import os
import qrcode
app = Flask(__name__)
# 数据库配置
db_config = {
'host': '127.0.0.1',
'user': 'abc',
'password': 'abc',
'database': 'abc_v3'
}
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
def upload_file_to_db(file_path, mime_type,file_name):
try:
# 连接数据库
conn = mysql.connector.connect(
host=db_config['host'],
user=db_config['user'],
password=db_config['password'],
database=db_config['database']
)
cursor = conn.cursor()
# 读取文件内容
with open(file_path, 'rb') as file:
file_data = file.read()
# 插入文件数据,注意注意注意下面的pdf_documents是我自己数据库里放pdf的表名称,需要改成你自己表的名字!!!
query = "INSERT INTO pdf_documents (name, mime_type,content,file_path) VALUES (%s, %s,%s,%s)"
cursor.execute(query, (file_name,mime_type, file_data,file_path))
conn.commit()
print(f"File '{file_name}' uploaded successfully.")
except mysql.connector.Error as err:
print(f"Error: {err}")
finally:
cursor.close()
conn.close()
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file:
file_path = os.path.join('uploads', file.filename)
file.save(file_path)
upload_file_to_db(file_path,'application/pdf', file.filename)
return 'File uploaded successfully'
return '''
<html>
<body>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
</body>
</html>
'''
# 配置文件夹路径
app.config['DOCUMENTS_FOLDER'] = 'uploads'
# 确保文件夹存在
def ensure_folder_exists(folder_path):
if not os.path.exists(folder_path):
os.makedirs(folder_path)
ensure_folder_exists(app.config['DOCUMENTS_FOLDER'])
@app.route('/uploads/<filename>')
def download_file(filename):
try:
return send_from_directory(app.config['DOCUMENTS_FOLDER'], filename)
except FileNotFoundError:
abort(404)
def get_file_path_from_db(file_id):
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
query = "SELECT file_path FROM pdf_documents WHERE id = %s"
cursor.execute(query, (file_id,))
result = cursor.fetchone()
return result[0] if result else None
except mysql.connector.Error as err:
print(f"Database error: {err}")
return None
finally:
cursor.close()
conn.close()
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8000)
需要下载以下库,指令如下
pip install mysql-connector-python flask qrcode -i https://pypi.tuna.tsinghua.edu.cn/simple
配置好自己本地数据库的用户密码和数据库名字,就直接运行上述代码
再在浏览器里输入
http://127.0.0.1:8000/upload
即可出现上述画面
最后这里将我们要上传的pdf选择好,并提交,就会插入到我们自己数据库里啦!
这里需要提前建表,需要包含name,file_path,mime_type,content,upload_time字段,照着抄,这样运行代码就不用改直接能用
上传文件会自动保存到本地项目的文件里
上传完文件到生成二维码的代码了
generate_qcr.py
from stat import FILE_ATTRIBUTE_NO_SCRUB_DATA
import qrcode
import mysql.connector
# 配置数据库连接
db_config = {
'host': 'localhost',
'user': 'abc',
'password': 'abc',
'database': 'abc_v3'
}
# 获取文件路径的URL
def get_file_id_url(file_id, server_ip):
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
query = "SELECT file_path, name FROM pdf_documents WHERE id = %s"
cursor.execute(query, (file_id,))
result = cursor.fetchone()
cursor.close()
conn.close()
file_path, file_name = result
if result:
# 使用服务器的本地网络 IP 地址
return f"http://{server_ip}:8000/uploads/{file_name}"
else:
return None
# 生成二维码
def generate_qr_code(data, output_file):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
img.save(output_file)
# 生成包含本地文档路径的二维码
def generate_qrcode(local_file_path,output_file):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(local_file_path)
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white")
qr_img.save(output_file) # 保存生成的二维码图片
if __name__ == '__main__':
file_id = 9 # 要生成二维码的文件 ID,这个ID是你数据库里存的那个文件ID
server_ip = '192.168.101.45' # 替换为你的服务器的本地 IP 地址
file_url = get_file_id_url(file_id, server_ip)
if file_url:
# generate_qr_code(file_url, f'qr_code_{file_id}.png')
generate_qrcode(file_url, f'qr_code_{file_id}.png')
print(f"QR code generated for URL: {file_url}")
else:
print("File ID not found in the database.")
一键运行即可生成二维码
扫描二维码就可以拿到我们上传到本地数据库的文件了
根据pdf在数据库表中唯一id查找文件名并合成url,再生成二维码,注意服务器IP地址为实际IP地址,不是localhost也不是127.0.0.1,本机的IP为192.168.101.45。
在项目启动时,同时手机和服务器在同一局域网时,即可实现扫码得说明书。目前只实现了扫码跳转下载pdf文档。
我的项目没有启动,是部署在本地所以扫这个二维码大家扫不出东西【捂脸】但是你们自己在自己电脑上跑项目是可以扫出东西的