Я создал свой проект на Flask. Он состоит из одной части, которая загружает файл расширения docx, и двух полей в почтовом запросе. Он работает хорошо. Однако когда я отправляю файл docx, содержащий изображения, проект flask не может видеть файл в запросе. Я попытался отправить docx-файл с изображением с помощью функции HTTP-клиента JetBrains, это сработало хорошо.
Ниже я предоставлю все необходимые коды и изображения, связанные с моей проблемой:
myproject/app/init.py
from flask import Flask
from flask_jwt_extended import JWTManager
from app.extensions import db, migrate
from app.config import Config
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 16 MB
db.init_app(app)
migrate.init_app(app, db)
JWTManager(app)
with app.app_context():
from app.routes.auth import auth_bp
from app.routes.upload import upload_bp
from app.routes.search import search_bp
app.register_blueprint(auth_bp, url_prefix='/auth')
app.register_blueprint(upload_bp, url_prefix='/upload')
app.register_blueprint(search_bp, url_prefix='/search')
# Ensure models are imported
from app.models import User, Word, Instance, Params, InstanceParamsLink, InstanceWordLink
return app
myproject/app/routes/upload.py
import mimetypes
import os
from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from werkzeug.exceptions import BadRequestKeyError
from app.models import User, Instance, Params, InstanceParamsLink
from app.services.doc_service import extract_words, insert_words_and_document
from app.extensions import db
upload_bp = Blueprint('upload', __name__)
@upload_bp.route('/', methods=['POST'])
@jwt_required()
def upload_file():
print(request.files)
try:
file = request.files['file']
except BadRequestKeyError:
return jsonify({"error": "No file part in the request"}), 400
except KeyError:
return jsonify({"error": "No file provided"}), 400
if file.filename == '':
return jsonify({"error": "No file provided"}), 400
# Save the file temporarily
temp_dir = '/tmp' if os.name != 'nt' else os.getenv('TEMP')
file_path = os.path.join(temp_dir, file.filename)
file.save(file_path)
# Check if the file is a DOCX file
mime_type, _ = mimetypes.guess_type(file_path)
if mime_type != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
return jsonify({"error": "File is not in DOCX format"}), 400
try:
# Get form data
form_data = request.form.to_dict()
# Get the user who uploaded the file
username = get_jwt_identity()
user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one()
user_id = user.id
# Create a new instance for the user
instance = Instance(project_id=user_id)
db.session.add(instance)
db.session.commit()
# Process form data and add instance params
for key, value in form_data.items():
params = db.session.execute(db.select(Params).filter_by(name=key)).scalar_one_or_none()
if not params:
params = Params(name=key)
db.session.add(params)
db.session.commit()
params = db.session.execute(db.select(Params).filter_by(name=key)).scalar_one()
instance_params_link = InstanceParamsLink(
param_id=params.id,
value=value,
instance_id=instance.id
)
db.session.add(instance_params_link)
db.session.commit()
# Extract words from the file
with open(file_path, 'rb') as file_stream:
words = extract_words(file_stream)
# Insert words and document links
insert_words_and_document(db.session, instance.id, words)
return jsonify({"status": "success", "file": file.filename})
finally:
# Clean up the temporary file
if os.path.exists(file_path):
os.remove(file_path)
Подробнее здесь: https://stackoverflow.com/questions/785 ... in-postman