-
Notifications
You must be signed in to change notification settings - Fork 1
/
app.py
128 lines (103 loc) · 4.99 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from flask import Flask, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
import os
import threading
import time
import logging
import shutil
import project
app = Flask(__name__)
CORS(app)
# Настройка базы данных
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///files.db'
db = SQLAlchemy(app)
# Настройка папки для загрузки и результатов обработки файлов
UPLOAD_FOLDER = 'upload'
PROCESSED_FOLDER = 'processed'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
if not os.path.exists(PROCESSED_FOLDER):
os.makedirs(PROCESSED_FOLDER)
# Настройка логирования
logging.basicConfig(filename='processing.log', level=logging.INFO)
# Модель базы данных
class File(db.Model):
id = db.Column(db.Integer, primary_key=True)
time = db.Column(db.DateTime, default=db.func.current_timestamp(), nullable=False)
name = db.Column(db.String(255), nullable=False)
status = db.Column(db.String(255), default='Идет обработка', nullable=False)
status_final = db.Column(db.Boolean, default=False, nullable=False)
result_final = db.Column(db.String(255), nullable=True) # Добавлено для хранения имени обработанного файла
with app.app_context():
db.create_all()
_processed_filename = ''
# Функция обработки файла (эмуляция длительной обработки)
def process_file(file_id):
global _processed_filename
with app.app_context():
logging.info(f"process_file - {file_id}")
try:
file = db.session.get(File, file_id)
if file:
logging.info(f"process_file start - {file.name} с ID {file_id}")
# Путь к исходному и обработанному файлу
original_filepath = os.path.join(UPLOAD_FOLDER, file.name)
processed_filename = f"processed_{file.name}"
_processed_filename = processed_filename
processed_filepath = os.path.join(PROCESSED_FOLDER, processed_filename)
project.make_table_of_contents(original_filepath)
tmp = 'new.pdf'
# Копируем оригинальный PDF файл в папку processed
shutil.copyfile(tmp, processed_filepath)
# Обновляем информацию о файле
file.status = 'Обработка завершена'
file.result_final = processed_filename
file.status_final = True
db.session.commit()
logging.info(f"Обработка файла {file.name} завершена. Результат сохранён в {processed_filename}.")
except Exception as e:
logging.error(f"ERROR FILE - {file_id}: {str(e)}")
# Первый эндпоинт для загрузки файла
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': 'Файл не найден'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'Имя файла пустое'}), 400
if not file.filename.endswith('.pdf'):
return jsonify({'error': 'Файл не является PDF'}), 400
filename = file.filename
filepath = os.path.join(UPLOAD_FOLDER, filename)
file.save(filepath)
new_file = File(name=filename, result_final="")
db.session.add(new_file)
db.session.commit()
logging.info(f"Запуск потока обработки - ID {new_file.id}")
# Запуск обработки в отдельном потоке
thread = threading.Thread(target=process_file, args=(new_file.id,))
thread.start()
logging.info(f"Файл - ID {new_file.id} загружен и начата обработка")
return jsonify({'id': new_file.id}), 200
# Второй эндпоинт для проверки статуса обработки
@app.route('/status/<int:file_id>', methods=['GET'])
def check_status(file_id):
file = File.query.get(file_id)
if not file:
return jsonify({'error': 'Файл не найден'}), 404
return jsonify({
'id': file.id,
'status': file.status,
'status_final': file.status_final,
'result_final': file.result_final
}), 200
# Эндпоинт для скачивания обработанного файла
@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
try:
return send_from_directory(PROCESSED_FOLDER, _processed_filename, as_attachment=True)
except Exception as e:
return jsonify({'error': 'Файл не найден'}), 404
if __name__ == '__main__':
app.run(debug=True)