Search code examples
c#asp.net-mvcasp.net-core-webapihttppostedfilebase

Posting a file from ASP.NET MVC 4.6 application to ASP.NET Core Web API


I have an ASP.NET MVC web application using in the .NET Framework 4.6.

I need to be able to upload files and then forward them to a ASP.NET Core 3.1 Web API.

The problem is I can't figure out how to send files from the client app to the API.

The API accepts a request like so:

public class ReportUploadRequest
{
    public List<IFormFile> Files { get; set; }
    public int FolderId { get; set; }
    public int BrokerId { get; set; }
}

and the ASP.NET MVC application has a controller function that accepts a form submission and attempts to post to the API.

The files from the form are received in ASP.NET MVC like so:

HttpPostedFileBase[] Files

I cannot work out how to convert the HttpPostedFileBase[] Files files to the List<IFormFile> Files format required by the Web API.

I have tried to receive the files in my controller using List<IFormFile> Files but Files is null on submission

How do I prepare my form to be consumed in a format agreeable to the Web API?


Solution

  • I am not sure that this is what you are asking for but I think it might be. I have found as long as I can get something into and out of binary, then I am golden. This also provides me with good interoperability with other languages like C+++.

    If not what you are asking.. tell me and I will delete my answer.

    This is what I did. I specifically needed binary data to be passed to my controller and binary data returned.

    For my use case, the secret was in application/octet-stream.

    [Route("api/[controller]")]
    [ApiController]
    public class SomeDangController : ControllerBase
    {
        [HttpPost]
        [Produces("application/octet-stream")]
        public async Task<Stream> GetBinaryThingy()
        {
            using (var reader = new StreamReader(HttpContext.Request.Body))
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    await reader.BaseStream.CopyToAsync(ms);
    
                    var buffer = ms.ToArray();
                    //buffer now holds binary data from the client
                }
           }
           byte[] bytes_return = null  //populate your binary return here.
           return new MemoryStream(bytes_return);
       }
    }
    

    And on the client.. something like this:

        public async System.Threading.Tasks.Task<byte[]> PostBinaryStuffAsync(byte[] buffer)
        {
            ByteArrayContent byteContent = new ByteArrayContent(buffer);
    
            var response = await client.PostAsync(dangServerURL, byteContent);
    
            var responseBytes = await response.Content.ReadAsByteArrayAsync();
    
            return responseBytes;
        }