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:
@@ -88,13 +88,27 @@ public static class MediaEndpoints
|
||||
var extension = Path.GetExtension(fileName);
|
||||
var token = await storage.SaveUploadAsync(request.Body, extension, cancellationToken);
|
||||
|
||||
var result = await sender.Send(
|
||||
new RegisterMediaAssetCommand(token, MediaSource.Upload, fileName),
|
||||
cancellationToken
|
||||
);
|
||||
// Файл уже на диске в uploads/, но в БД его ещё нет и ссылок на токен нигде не остаётся:
|
||||
// любой исход, кроме успешной регистрации, обязан за собой убрать. Удаляем и при исключении
|
||||
// (оборванный запрос, сбой БД) — иначе гигабайты остаются в uploads/ до уборщика.
|
||||
// Токен отмены для уборки не пробрасываем: при обрыве запроса он уже сработал.
|
||||
Result<Guid> result;
|
||||
try
|
||||
{
|
||||
result = await sender.Send(
|
||||
new RegisterMediaAssetCommand(token, MediaSource.Upload, fileName),
|
||||
cancellationToken
|
||||
);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await storage.DeleteUploadAsync(token, CancellationToken.None);
|
||||
throw;
|
||||
}
|
||||
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
await storage.DeleteUploadAsync(token, cancellationToken);
|
||||
await storage.DeleteUploadAsync(token, CancellationToken.None);
|
||||
return result.ToHttpResult();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user