How to pass data and image both to "ASP.NET Core" Web API using Angular 2(typescript)? How to pass data and image both to "ASP.NET Core" Web API using Angular 2(typescript)? angular angular

How to pass data and image both to "ASP.NET Core" Web API using Angular 2(typescript)?


Solution 1:

The simplest way is sending the image as a base64 string.

Just create a simple JavaScript function to read the file and convert it to base64 string. Do it before sending the file - probably onchange event on the <input> will do the job for you.

Then you can store it directly in DB (or save as a file on the server if you need).

Image stored as base64 string can be send back and displaed directly by browser without additional actions, for example:

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


Solution 2:

Frontend:

If you are using HTML5 and a file upload control, just set form encoding as multipart/form-data:

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

Backend:

Your property in the model should have type IFormFile, then you can save the file on the server:

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


Just set your model and POST/PUT it via webapi as you are used to do.I assume you have a web-api model object providing attributes for structured data and the image. usually a varbinary(max) in sql server.

In the snippet below I do what you are asking for with the "newattachment" object, which is actually a webapi-model.

For getting a new empty attachment-object I do a GET first against the webapi-Model used to store the images. In the next step I set the properties of this model including the image data itself ( a base64 encoded) string. Finally I do PUT/POST do save the object in the database)Client Side: Angular 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')                    });                });

Server Side (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);        }