Как передать данные и изображение в "ASP.NET Core" веб-API с использованием Angular 2 (typescript)?

у меня есть код, который может передавать данные только в веб-API, но я хочу передать данные и изображение как в тот же запрос не в другом запросе используя угловой 2 + typescript и в ASP.Net Core Web API.

мой код для передачи данных в API:

Угловое Код:

   create(user) {
    return this.authHttp.post(this._baseUrl + 'user/', JSON.stringify(userData)).map((res: Response) => {
        return res;
    }).catch(this.configService.handleError);
}

код API:

    [HttpPost]
    public IActionResult Create([FromBody]UserModel user)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        //save user
        _userRepository.Add(user);
        _userRepository.Commit();

        return new OkObjectResult(user.UserId);
    }

2 ответов


Решение 1:

самый простой способ-отправить изображение как строку base64.

просто создайте простую функцию JavaScript, чтобы прочитать файл и преобразовать его в строку base64. Сделайте это перед отправкой файла-возможно onChange, после событие <input> сделает работу для вас.

затем вы можете сохранить его непосредственно в БД (или сохранить как файл на сервере, если вам нужно).

изображения сохраненная как строка base64 может быть отправлена обратно и отображена непосредственно браузером без дополнительных действий, например:

<img src="data:image/bmp;base64,[base64EncodedImageHere]" />


решение 2:

интерфейс:

если вы используете HTML5 и контроль загрузки файлов, просто установите кодировку формы как multipart/form-data:

<form method="post" enctype="multipart/form-data">

бэкэнд:

ваше свойство в модели должно иметь тип IFormFile, затем вы можете сохранить файл на сервер:

IFormFile file;

using (var fileStream = File.Create( [file path here] ))
{
    await file.CopyToAsync(fileStream);
    await fileStream.FlushAsync();
}

просто установите свою модель и опубликуйте / поместите ее через webapi, как вы привыкли делать. Я предполагаю, что у вас есть объект модели web-api, предоставляющий атрибуты для структурированных данных и изображения. обычно varbinary (max) в sql server.

в приведенном ниже фрагменте я делаю то, что вы просите с объектом "newattachment", который на самом деле является webapi-моделью.

для получения нового пустого объекта вложения я делаю GET first против webapi-модели, используемой для хранения изображений. На следующем этапе I задайте свойства этой модели, включая саму строку данных изображения ( закодированную в base64). Наконец, я ставлю / публикую, сохраняю объект в базе данных) Сторона Клиента: Угловой 2

         this.dataService.getRecord('MT_DOKUMENTATION', -1)
            .subscribe((data: any[]) => {
                if (data) {
                var newattachment: any = data;
                newattachment.dokumentation = this.attachmentdata.split("base64,")[1];
                this.dataService.saveRecord('MT_DOKUMENTATION', "id", newattachment)
                    .subscribe((data: any[]) => {
                        var newrec: any = data;
                        ...
                    },
                    error => {
                        console.log(error);
                    },
                    () => {
                        console.log('Image Save complete')
                    });
                });

серверная сторона (C#, Web API):

        // PUT: api/MT_DOKUMENTATION/5
        [ResponseType(typeof(void))]
        public async Task<IHttpActionResult> PutMT_DOKUMENTATION(int id, MT_DOKUMENTATION mT_DOKUMENTATION)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.Entry(mT_DOKUMENTATION).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
               ...              
            }

            return Ok(mT_DOKUMENTATION);
        }