Receive file and other form data together in ASP.NET Core Web API (boundary based request parsing)
Solution 1
I had the similar issue and I solved the problem by using [FromForm]
attribute and FileUploadModelView
in the function as follow:
[HttpPost]
[Route("upload")]
public async Task<IActionResult> Upload([FromForm] FileUploadViewModel model, [FromForm] string member_code)
{
var file = model.File;
// ...
}
Solution 2
This is a quick solution for anyone who is facing the same issue:
You will use ajax to send the following formData
let formData: FormData;
formData = new FormData();
formData.append('imageFile', imageFile);
formData.append('name', name);
Then you will receive it in your controller like this:
public string Post(IFormCollection data, IFormFile imageFile)
Then you will access the data as you do normally:
var name = data["name"];
Solution 3
In HomeController.cs
using Microsoft.AspNetCore.Hosting;
.......
private IHostingEnvironment _environment;
public HomeController(IHostingEnvironment environment)
{
_environment = environment;
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index(IFormCollection formdata)
{
var files = HttpContext.Request.Form.Files;
foreach (var file in files)
{
var uploads = Path.Combine(_environment.WebRootPath, "Images");
if (file.Length > 0)
{
string FileName = Guid.NewGuid(); // Give file name
using (var fileStream = new FileStream(Path.Combine(uploads, FileName), FileMode.Create))
{
file.CopyToAsync(fileStream);
}
}
}
}
In view - Index.cshtml
<form method="post" enctype="multipart/form-data" >
.....
</form>
You can try this code.
Thanks!!
Solution 4
I'm using the following code to accomplish this in order to parse a response from Mailgun, which comprises both files and text values.
Please note that "dashifying" is just so property names like "MessageHeaders" get turned into "message-headers"; obviously you should use whatever logic makes sense for your use case.
Controller:
using System;
using Microsoft.AspNetCore.Mvc;
using NuGet.Protocol.Core.v3;
namespace Potato
{
[Route("api/[controller]")]
public class MailgunController : Controller
{
[HttpPost]
public IActionResult Post()
{
MailgunEmail email = new MailgunEmail(Request);
return Ok(email.ToJson());
}
}
}
Model:
using System;
using System.Reflection;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
namespace Potato
{
public class MailgunEmail
{
public IEnumerable<IFormFile> Attachments { get; set; }
public string Recipient { get; set; }
public string Sender { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string BodyPlain { get; set; }
public string StrippedText { get; set; }
public string StrippedSignature { get; set; }
public string BodyHtml { get; set; }
public string StrippedHtml { get; set; }
public int? AttachmentCount { get; set; }
public int Timestamp { get; set; }
public string Token { get; set; }
public string Signature { get; set; }
public string MessageHeaders { get; set; }
public string ContentIdMap { get; set; }
public MailgunEmail(HttpRequest request)
{
var form = request.Form;
Attachments = new List<IFormFile>(form.Files);
foreach (var prop in typeof(MailgunEmail).GetProperties()) {
string propName = Dashify(prop.Name);
var curVal = form[propName];
if (curVal.Count > 0) {
prop.SetValue(this, To(curVal[0], prop.PropertyType), null);
}
}
}
private object To(IConvertible obj, Type t)
{
Type u = Nullable.GetUnderlyingType(t);
if (u != null) {
return (obj == null) ? GetDefaultValue(t) : Convert.ChangeType(obj, u);
} else {
return Convert.ChangeType(obj, t);
}
}
private object GetDefaultValue(Type t)
{
if (t.GetTypeInfo().IsValueType) {
return Activator.CreateInstance(t);
}
return null;
}
private string Dashify(string source)
{
string result = "";
var chars = source.ToCharArray();
for (int i = 0; i < chars.Length; ++i) {
var c = chars[i];
if (i > 0 && char.IsUpper(c)) {
result += '-';
}
result += char.ToLower(c);
}
return result;
}
}
}
Solution 5
This page helped me a lot https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads
so now in my code I have the controller method as:
public async Task<IActionResult> UploadFiles(UploadedFile ups)
and a class for the model as
public class UploadedFile
{
public string UploadName { get; set; }
public List<IFormFile> Files { get; set; }
}
and the form like
<form method="post" enctype="multipart/form-data" asp-controller="Files" asp-action="UploadFiles">
Related videos on Youtube
shashwat
Programmer by Choice, Solution Architect by Profession, Tech Explorer, Animal Lover and Homesick. I love developing solutions for complex real world problems using modern programming languages. A Fan of C# because of its simplicity.
Updated on July 09, 2022Comments
-
shashwat almost 2 years
How would you form your parameters for the action method which is supposed to receive one
file
and onetext
value from the request?I tried this
public string Post([FromBody]string name, [FromBody]IFormFile imageFile)
And tried hitting it from Postman but it gives me
500 Internal Server Error
. I also can't debug it because it never hits the first statement inside the action method where I've put my breakpoint.Any idea how can we parse boundary based requests and extract file(s) and other textual field(s)? I am new to ASP.NET Core.
-
Madurika Welivita over 6 yearsAny solution for this issue?
-
shashwat over 6 years@MadurikaWelivita I had developed separate API for form data and images, but you should try answers posted by users.
-
-
shashwat over 7 yearsI do not have
Content
property inRequest
object. Also, I am not transmitting file and text both in JSON. I wonder if it is possible easily. I am sending for inmultipart/form-data
(boundary based requests). Sorry, but your solution can't work for me. -
shashwat over 6 yearsthanks @mslliviu, I will try and update if it's working for me or not
-
Diego Martelli over 6 yearsIt's not working on a asp.net core 2 action using postman. All the non files properties are populated, the Files property it's null. Request object contains the files.
-
bikram s. over 3 yearsI was struggling to retrieve FormData value at ASP.NET Core end and the last line helped me. Thanks.
-
Kanmuri almost 3 yearsIt appears you are getting the
IFormCollection
as a parameter to your controller method there, and then completely ignoring it and re-pulling it from theHttpContext.Request
. Is there a reason behind doing so, or is that just an oversight? :) -
Qwertie over 2 yearsWhat in the world is
FileUploadViewModel
?