Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to post httppostedfile to webapi

How do I post a httppostedfile to a webapi? Basically I want the user to select an excel file and I want to post it to my webapi.

The gui is made with classic asp.net and the webapi is made with new .NET apicontroller.

I have done some api coding before but then I used JSON and that doesn't seem to work very good with this kind of object.

Can someone please just point me in the right direction so that I can continue to search for info. Right now I don't even know what to search for.

like image 333
Daniel Gustafsson Avatar asked Nov 10 '22 12:11

Daniel Gustafsson


1 Answers

I solved this by doing this: In my controller:

 using (var client = new HttpClient())
            using (var content = new MultipartFormDataContent())
            {
                client.BaseAddress = new Uri(System.Configuration.ConfigurationManager.AppSettings["PAM_WebApi"]);
                var fileContent = new ByteArrayContent(excelBytes);
                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };
                content.Add(fileContent);
                var result = client.PostAsync("api/Product", content).Result;
            }

And here is my ApiController:

 [RoutePrefix("api/Product")]
public class ProductController : ApiController
{
    public async Task<List<string>> PostAsync()
    {
        if (Request.Content.IsMimeMultipartContent())
        {
            string uploadPath = HttpContext.Current.Server.MapPath("~/uploads");
            if (!System.IO.Directory.Exists(uploadPath))
            {
                System.IO.Directory.CreateDirectory(uploadPath);
            }
            MyStreamProvider streamProvider = new MyStreamProvider(uploadPath);

            await Request.Content.ReadAsMultipartAsync(streamProvider);

            List<string> messages = new List<string>();
            foreach (var file in streamProvider.FileData)
            {
                FileInfo fi = new FileInfo(file.LocalFileName);
                messages.Add("File uploaded as " + fi.FullName + " (" + fi.Length + " bytes)");
            }

            return messages;
        }
        else
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid Request!");
            throw new HttpResponseException(response);
        }
    }
}

    public class MyStreamProvider : MultipartFormDataStreamProvider
   {
        public MyStreamProvider(string uploadPath)
             : base(uploadPath)
        {

      }

public override string GetLocalFileName(HttpContentHeaders headers)
{
    string fileName = headers.ContentDisposition.FileName;
    if (string.IsNullOrWhiteSpace(fileName))
    {
        fileName = Guid.NewGuid().ToString() + ".xls";
    }
    return fileName.Replace("\"", string.Empty);
}
}

I found this code in a tutorial so i'm not the one to be credited. So here i write the file to a folder. And because of the mysreamprovider i can get the same name of the file as the file i first added in the GUI. I also add the ending ".xls" to the file because my program is only going to handle excel files. Therefor i have added some validation to the input in my GUI to so that i know that the file added is an excel file.

like image 52
Daniel Gustafsson Avatar answered Nov 15 '22 10:11

Daniel Gustafsson