Загрузка файла и модели сотрудника в POST Web API - PullRequest
0 голосов
/ 10 июля 2020

У меня есть модель сотрудника и изображение профиля. Мне нужно загрузить изображение профиля и дату модели одним методом POST. Мне просто нужно сохранить имя файла изображения в базе данных и загрузить изображение в каталог Root.

Вот моя модель: publi c Частичный класс работодателей

{
    public int EmployerId { get; set; }
    public string Companyname { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Mobile { get; set; }
    public string Password { get; set; }
    public string DisplayImage { get; set; }
    public bool? IsActive { get; set; }
    public DateTime StateDate { get; set; }
}

Вот мой код контроллера:

    [HttpPost]
    public async Task<ActionResult<Employees>> PostEmployees([FromForm] FileUploadAPI Image, [FromBody]Employees employees)
    {
        try
        {
            _context.Employees.Add(employees);
            await _context.SaveChangesAsync();
            await UploadImage(Image, 2, employees.EmployeeId);
            var returnInfo = CreatedAtAction("GetEmployees", new { id = employees.EmployeeId }, employees);
            return returnInfo;
        }
        catch(Exception ex)
        {
            return NoContent();
        }
    }

    public class FileUploadAPI
    {
        public IFormFile files { get; set; }
    }

    public async Task<string> UploadImage(FileUploadAPI files, int UserType, int UserId)
    {
        if (files.files.Length > 0)
        {
            try
            {
                if (!Directory.Exists(_hostingEnvironment.WebRootPath + "\\Employees\\"))
                {
                    Directory.CreateDirectory(_hostingEnvironment.WebRootPath + "\\Employees\\");
                }
                Guid guid = Guid.NewGuid();
                string filename = _hostingEnvironment.WebRootPath + "\\Employees\\" + $"EM-{UserType}-UserId-{guid}";
                using (FileStream filestream = System.IO.File.Create(filename))
                {
                    await files.files.CopyToAsync(filestream);
                    filestream.Flush();
                    return filename;
                }
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }
        else
        {
            return "Not Found";
        }
    }

Если я просто загружаю файл в POSTMAN без модели сотрудника, он работает нормально. Но когда я передаю оба данных File EMployee, тогда FILE возвращает значение null.

Любое предложение, решение?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Сначала измените FromBody на FromForm. Затем, поскольку вы хотите сохранить имя файла в базе данных, измените свой код, как показано ниже:

[HttpPost]
public async Task<ActionResult<Employers>> PostEmployees([FromForm] FileUploadAPI Image, [FromForm]Employers employees)
{
    try
    {                
        var filename = await UploadImage(Image, 2, employees.EmployerId);
        employees.DisplayImage = filename;
        _context.Employers.Add(employees);
        await _context.SaveChangesAsync();
        var returnInfo = CreatedAtAction("GetEmployees", new { id = employees.EmployerId }, employees);
        return returnInfo;
    }
    catch (Exception ex)
    {
        return NoContent();
    }
}

Ваш почтальон должен выглядеть следующим образом: enter image description here

Result: введите описание изображения здесь

0 голосов
/ 10 июля 2020

Невозможно использовать [FromForm] и [FromBody] одновременно, как указано здесь . Но я думаю, у вас есть 2 варианта:

Вы можете либо поместить свое тело JSON в форму и отправить Employee данные помимо File, либо использовать 2 отдельные конечные точки для загрузки формы. Конечная точка для загрузки изображения пользователя с использованием [FromFile] и получения pictureId, а также для отправки Employee в теле с заполненным ключом pictureId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...