Correct file download format

This commit is contained in:
2025-04-13 00:42:36 +01:00
parent 2c641b0f64
commit b550d98eaf
2 changed files with 9 additions and 10 deletions
+4 -4
View File
@@ -8,6 +8,7 @@ import json
import logging import logging
import sys import sys
import traceback import traceback
import pathlib
from asyncio import Future from asyncio import Future
from typing import Dict, List, Tuple, Callable, Coroutine, Any from typing import Dict, List, Tuple, Callable, Coroutine, Any
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, urlparse
@@ -118,13 +119,12 @@ async def convert_file_response(obj: FileResponse, channel: AbstractRobustChanne
""" """
Converts a FileResponse object to a JSON string containing the filename and stream. Converts a FileResponse object to a JSON string containing the filename and stream.
""" """
_future: Future[str] = asyncio.Future(loop=channel.channel.loop) (_stream_name, _file_size) = await publish_file_to_rabbitmq(channel, obj.path)
asyncio.run_coroutine_threadsafe(
publish_file_to_rabbitmq(channel, obj.path, _future), loop=channel.channel.loop)
return json.dumps({'files': [ return json.dumps({'files': [
{'filename': obj.filename, {'filename': obj.filename,
'mediaType': 'application/octet-stream', 'mediaType': 'application/octet-stream',
'streamName': _future.result() 'streamName': _stream_name,
'fileSize': _file_size
}] }]
}) })
+5 -6
View File
@@ -6,18 +6,19 @@ import os
from pathlib import Path from pathlib import Path
from aio_pika.abc import AbstractRobustChannel from aio_pika.abc import AbstractRobustChannel
from aio_pika import Message, DeliveryMode from aio_pika import Message, DeliveryMode
from amqp.adapter.file_downloader import IN_PROGRESS, END_OF_FILE
from amqp.router.router_base import AMQ_REPLY_TO_EXCHANGE from amqp.router.router_base import AMQ_REPLY_TO_EXCHANGE
async def publish_file_to_rabbitmq( async def publish_file_to_rabbitmq(
channel: AbstractRobustChannel, channel: AbstractRobustChannel,
file_path: Path, file_path: Path,
future: asyncio.Future[str] = None,
max_chunk_size: int = 2**20, # 1MB default chunk size max_chunk_size: int = 2**20, # 1MB default chunk size
exchange_name: str = AMQ_REPLY_TO_EXCHANGE, exchange_name: str = AMQ_REPLY_TO_EXCHANGE,
content_type: str = 'application/octet-stream', # Default content type content_type: str = 'application/octet-stream', # Default content type
delivery_mode: DeliveryMode = DeliveryMode.PERSISTENT, delivery_mode: DeliveryMode = DeliveryMode.PERSISTENT,
) -> str: ) -> tuple[str, int]:
""" """
Reads a file from the file system and publishes its content to a RabbitMQ exchange Reads a file from the file system and publishes its content to a RabbitMQ exchange
in chunks. It declares a queue with a random name, binds it to the specified in chunks. It declares a queue with a random name, binds it to the specified
@@ -63,7 +64,7 @@ async def publish_file_to_rabbitmq(
'offset': _offset, 'offset': _offset,
'total_size': _file_size, 'total_size': _file_size,
'chunk_size': len(_chunk), 'chunk_size': len(_chunk),
'last_chunk': max_chunk_size + _offset >= _file_size 'eof': END_OF_FILE if max_chunk_size + _offset >= _file_size else IN_PROGRESS
} }
) )
await _exchange.publish(message, routing_key=_queue_name) await _exchange.publish(message, routing_key=_queue_name)
@@ -71,6 +72,4 @@ async def publish_file_to_rabbitmq(
logging.debug(f"Published chunk {_offset}/{_file_size} to {exchange_name}:{_queue_name}") logging.debug(f"Published chunk {_offset}/{_file_size} to {exchange_name}:{_queue_name}")
print(f"File {file_path} published to RabbitMQ exchange {exchange_name}, queue {_queue_name}") print(f"File {file_path} published to RabbitMQ exchange {exchange_name}, queue {_queue_name}")
if future: return _queue_name, _file_size
future.set_result(_queue_name)
return _queue_name