public async Task <IActionResult> DownloadAsync(Controller controller, IReadOnlyList <FileEntity> entities, UserInfo user, string baseName, string suffix) { if (entities == null) { throw new ArgumentNullException(nameof(entities)); } if (user == null) { throw new ArgumentNullException(nameof(user)); } if (String.IsNullOrWhiteSpace(baseName)) { throw new ArgumentNullException(nameof(baseName)); } _logger.LogDebug($"{user} начал скачивание {entities.Count} файлов"); // здесь может быть скачивание файлов с SFTP сервера во временную директорию var tempFiles = entities .Select(x => new FileNames(Path.Combine(x.StorageFilePath, x.StorageFileName), x.UserFileName)) .Where(x => File.Exists(x.StorageFileName)) // отфильтруем существующие .ToArray(); if (tempFiles.Length < 1) { throw new EntityNotFoundException("Файлы не были найдены. Возможно они уже удалены"); } // если файл 1, то не надо архивировать if (tempFiles.Length == 1) { return(SendFile(controller, tempFiles.First())); } // архивируем _logger.LogDebug("Архивируем файлы"); var archiveStorageName = await _archiver.ZipFilesToFileAsync(tempFiles); var archiveUserName = GetArchiveName(user, baseName, suffix); var fileData = new FileNames(archiveStorageName, archiveUserName); _logger.LogInformation($"Создан временный архив: \"{archiveStorageName}\""); // удаляем временные файлы, если скачали их с SFTP сервера // foreach (var tempFile in tempFiles) // { // File.Delete(tempFile.StorageFileName); // } _logger.LogInformation($"Удалено {tempFiles.Length} временных файлов"); return(SendFile(controller, fileData)); }