How To Accept a File POST
see http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime#multipartmime, although I think the article makes it seem a bit more complicated than it really is.
Basically,
public Task<HttpResponseMessage> PostFile()
{
HttpRequestMessage request = this.Request;
if (!request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads");
var provider = new MultipartFormDataStreamProvider(root);
var task = request.Content.ReadAsMultipartAsync(provider).
ContinueWith<HttpResponseMessage>(o =>
{
string file1 = provider.BodyPartFileNames.First().Value;
// this is the file name on the server where the file was saved
return new HttpResponseMessage()
{
Content = new StringContent("File uploaded.")
};
}
);
return task;
}
How to accept a file upload AND some data as a POST to a .NET REST API
You can convert the file to a base64 encoded byte array and send that up as a property in the JSON object you're sending. No need for special headers, "application/json" and post will work just fine.
Stack overflow question concerning using javascript to convert a file to a base64 encoded byte array.
C# should just be File.WriteAllBytes(), or store the byte array in a database or other data store.
Accept a POSTED file
Try this:
[HttpPost]
[Route("api/uploadPDF")]
public async Task<IHttpActionResult> UploadFile()
{
try
{
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
return StatusCode(HttpStatusCode.UnsupportedMediaType);
}
var fileProvider = await Request.Content.ReadAsMultipartAsync();
var pdfStream = await fileProvider.Contents.First().ReadAsStreamAsync();
//do something with the pdf stream
return Ok(new { Posted = true });
}
catch (Exception ex)
{
ex.LogException();
return InternalServerError(ex);
}
}
How to post a file from a form with Axios
Add the file to a formData
object, and set the Content-Type
header to multipart/form-data
.
var formData = new FormData();
var imagefile = document.querySelector('#file');
formData.append("image", imagefile.files[0]);
axios.post('upload_file', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
How do I upload a file with the JS fetch API?
This is a basic example with comments. The upload
function is what you are looking for:
// Select your input type file and store it in a variable
const input = document.getElementById('fileinput');
// This will upload the file after having read it
const upload = (file) => {
fetch('http://www.example.net', { // Your POST endpoint
method: 'POST',
headers: {
// Content-Type may need to be completely **omitted**
// or you may need something
"Content-Type": "You will perhaps need to define a content-type here"
},
body: file // This is your file object
}).then(
response => response.json() // if the response is a JSON object
).then(
success => console.log(success) // Handle the success response object
).catch(
error => console.log(error) // Handle the error response object
);
};
// Event handler executed when a file is selected
const onSelectFile = () => upload(input.files[0]);
// Add a listener on your input
// It will be triggered when a file will be selected
input.addEventListener('change', onSelectFile, false);
How to upload a file and JSON data in Postman?
In postman, set method type to POST.
Then select
Body -> form-data -> Enter your parameter name (file according to your code)
On the right side of the Key field, while hovering your mouse over it, there is a dropdown menu to select between Text/File. Select File, then a "Select Files" button will appear in the Value field.
For rest of "text" based parameters, you can post it like normally you do with postman. Just enter parameter name and select "text" from that right side dropdown menu and enter any value for it, hit send button. Your controller method should get called.
Upload a file with PUT/POST method on POSTMAN
While using Postman
especially when you test file upload ensure that,
- in Headers:
- The
Content-type
field has been set asmultipart/form-data
in Headers.
- The
- in Body:
form-data
option should remain as default.- Choose
File
option instead oftext
from the dropdown on the right side. - Type
File
in the text box where the placeholder iskey
.
How do I do file upload using ASP.NET Core 6 minimal api?
Currently out of the box support for binding in Minimal APIs is quite limited. Supported binding sources:
- Route values
- Query string
- Header
- Body (as JSON)
- Services provided by dependency injection
- Custom
NOTE: Binding from forms is not natively supported in .NET 6
You can either leverage custom binding or use special types handling:
app.MapPost("/upload", (HttpRequest request) =>
{
//Do something with the file
var files = request.Form.Files;
return Results.Ok();
})
.Accepts("multipart/form-data")
.Produces(200);
How does HTTP file upload work?
Let's take a look at what happens when you select a file and submit your form (I've truncated the headers for brevity):
POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"
100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object
... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--
NOTE: each boundary string must be prefixed with an extra --
, just like in the end of the last boundary string. The example above already includes this, but it can be easy to miss. See comment by @Andreas below.
Instead of URL encoding the form parameters, the form parameters (including the file data) are sent as sections in a multipart document in the body of the request.
In the example above, you can see the input MAX_FILE_SIZE
with the value set in the form, as well as a section containing the file data. The file name is part of the Content-Disposition
header.
The full details are here.
Related Topics
Setting a Property by Reflection With a String Value
How Does Having a Dynamic Variable Affect Performance
Split a List into Smaller Lists of N Size
What Is the 'Dynamic' Type in C# 4.0 Used For
How to Monitor SQL Server Table Changes by Using C#
Reliable Method to Get Machine'S MAC Address in C#
Reflection: How to Invoke Method With Parameters
Best Way to Compare Two Complex Objects
What's the Main Difference Between Int.Parse() and Convert.Toint32
Best Practices For Catching and Re-Throwing .Net Exceptions
Redirecttoaction With Parameter
Creating a Datetime in a Specific Time Zone in C#
What Is the Purpose of a Question Mark After a Value Type (For Example: Int? Myvariable)