Add upload cleanup functionality and improve error handling for media uploads
Implemented a new background service, UploadsCleanupBackgroundService, to manage stale uploads in the uploads directory. Enhanced error handling in the media upload process to ensure incomplete uploads are deleted immediately upon failure, preventing unnecessary storage usage. Updated the .env.example and StorageOptions to include configuration for stale upload retention time. Improved documentation to reflect these changes and clarify the upload process.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace TeleWave.Infrastructure.Media;
|
||||
|
||||
/// <summary>
|
||||
/// Расписание уборки <c>uploads/</c> (сама уборка — <see cref="UploadsCleaner"/>): проход на старте
|
||||
/// и раз в час. Удаление недописанного файла на месте
|
||||
/// (<see cref="FileSystemMediaStorage.SaveUploadAsync"/>) закрывает штатные обрывы, этот сервис —
|
||||
/// страховка от аварийного рестарта посреди заливки.
|
||||
/// </summary>
|
||||
public sealed class UploadsCleanupBackgroundService(
|
||||
MediaPathResolver paths,
|
||||
IOptions<StorageOptions> options,
|
||||
ILogger<UploadsCleanupBackgroundService> logger
|
||||
) : BackgroundService
|
||||
{
|
||||
/// <summary>Как часто заглядывать в каталог. Порог измеряется часами — чаще незачем.</summary>
|
||||
private static readonly TimeSpan Period = TimeSpan.FromHours(1);
|
||||
|
||||
private readonly StorageOptions _storage = options.Value;
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
if (_storage.StaleUploadHours <= 0)
|
||||
{
|
||||
logger.LogInformation("Уборка uploads/ выключена (Storage:StaleUploadHours = 0).");
|
||||
return;
|
||||
}
|
||||
|
||||
var retention = TimeSpan.FromHours(_storage.StaleUploadHours);
|
||||
paths.EnsureDirectories();
|
||||
|
||||
// Первый проход сразу: после аварийного рестарта недописанное лежит с прошлого запуска.
|
||||
UploadsCleaner.Sweep(paths, retention, logger);
|
||||
|
||||
using var timer = new PeriodicTimer(Period);
|
||||
while (await timer.WaitForNextTickAsync(stoppingToken))
|
||||
UploadsCleaner.Sweep(paths, retention, logger);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user