Пример #1
0
        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));
        }