Exemplo n.º 1
0
        public async Task <IActionResult> Post(
            [FromRoute]
            [SwaggerParameter("Идентификатор ответа")]
            Guid answerId,
            [FromForm]
            [SwaggerParameter("Список файлов")]
            IEnumerable <IFormFile> files)
        {
            // проверки существования answerId
            // также должна быть какая-то проверка, чтобы не добавляли файлы в чужие answerId, наверно какая-то авторизация
            // ....

            // Проверяем что нам передали файлы
            if (files == null)
            {
                return(StatusCode(400, new ErrorModel {
                    Message = "No Files Found"
                }));
            }
            if (files.Count() == 0)
            {
                return(StatusCode(400, new ErrorModel {
                    Message = "No Files Found"
                }));
            }

            try
            {
                // Получаем контейнер AzureBlobs
                BlobContainerClient containerClient = BlobClient.GetBlobContainerClient(BlobParameters.AzureBlobContainerName);


                // проходим по файлам
                foreach (IFormFile file in files)
                {
                    // Создаем класс для хранения данных о файле
                    AnswerAttachments aa = new AnswerAttachments
                    {
                        Id       = Guid.NewGuid(),
                        AnswerId = answerId,
                        Created  = DateTime.Now,
                        FileName = file.FileName,
                        MimeType = file.ContentType,
                        Size     = Convert.ToInt32(file.Length)
                    };

                    // Получаем клиента для нашего файла
                    BlobClient blobClient = containerClient.GetBlobClient(aa.Id.ToString("N"));

                    // загружаем данные в хранилище AzureBlobs
                    using (Stream st = file.OpenReadStream()) await blobClient.UploadAsync(st, true);

                    // Добавляем объект в контекст
                    DB.AnswerAttachments.Add(aa);
                }

                // сохраняем изменения в базе
                await DB.SaveChangesAsync();

                return(Ok("{}"));
            }
            catch
            {
                // Сообщам об ошибке
                return(StatusCode(500, new ErrorModel {
                    Message = "General Error Occured"
                }));

                // здесь бы добавить протоколирование ошибок
            }
        }