How to Upload a File in an Mvc3 C# Ajax Form
It's easy to upload file in a synchronous form, where you just post the file and read a HttpPostedFile variable in the server side: In ...
https://www.czetsuyatech.com/2012/02/c-file-upload-on-mvc.html
It's easy to upload file in a synchronous form, where you just post the file and read a HttpPostedFile variable in the server side:
In plain html form, take note of the form enctype property:
http://code.google.com/p/ajax-file-upload-struts2/source/browse/trunk/src/main/resources/template/com/davidjc/javascript/ajaxfileupload.js?r=4 So here's my implementation on uploading a file on an ajax form, using the javascript library I've mentioned above:
//the view (index.cshtml)
@using (Html.BeginForm("Upload", "File", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
}
public class FileController : Controller
{
//it should show index.cshtml view
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(HttpPostedFile file)
{
if (file != null && file.ContentLength > 0)
{ //now you have a non-empty file
//to save in a local directory
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Uploads"), fileName);
file.SaveAs(path);
}
return new EmptyResult();
}
}
That should work no problem but what if you have an ajax form, asynchronously you will not be able to upload a file together with the other form fields. So I've used a 3rd party javascript library to create a hidden iframe that will contain a file field.
http://code.google.com/p/ajax-file-upload-struts2/source/browse/trunk/src/main/resources/template/com/davidjc/javascript/ajaxfileupload.js?r=4 So here's my implementation on uploading a file on an ajax form, using the javascript library I've mentioned above:
//index.cshtml view
<script src="@Url.Content("~/Scripts/ajaxfileupload.js")" type="text/javascript"></script>
<script type="text/javascript">
function ajaxFileUpload() {
$.ajaxFileUpload
(
{
url: "@Url.Action("UploadAttachment", "File")",
secureuri: false,
fileElementId: 'FileUpload',
dataType: 'json',
data: {
Name: $('#Name').val(), //you can declare the other form elements here
},
success: function (data, status) {
if (typeof (data.error) != 'undefined') {
if (data.error != '') {
//alert(data.error);
} else {
//alert(data.msg);
}
}
},
error: function (data, status, e) {
//alert(e);
}
}
)
return false;
}
@using (Ajax.BeginForm("Upload", "File", new { }, new AjaxOptions { }, new { enctype = "multipart/form-data" }))
{
</script>
<table>
<tr>
<td class="label">
@Html.LabelFor(m => m.Name)
</td>
<td>
<div class="field_container">
@Html.TextBoxFor(m => m.Name)
</div>
</td>
</tr>
<tr>
<td class="label">
@Html.LabelFor(m => m.PathToAttachment)
</td>
<td>
<div class="field_container">
@Html.TextBoxFor(m => m.FileUpload, new { type = "file" })
</div>
</td>
</tr>
</table>
}
public class FileController : Controller
{
//it should show index.cshtml view
public ActionResult Index()
{
return View();
}
//do nothing on form submit
[HttpPost]
public ActionResult AddAttachment(AttachmentModel model)
{
return Json(new { success = true });
}
//this is where the file gets save in the server
public ActionResult UploadAttachment(String Name, HttpPostedFile FileUpload)
{
if (FileUpload.ContentLength > 0)
{
var r = new Random();
var uploadPath = Server.MapPath("~/Uploads");
var filename = FileName.Replace("_", "");
var savedFileName = Path.Combine(uploadPath, Path.GetFileName(filename));
//now you have your file
}
return new EmptyResult();
}
}




3 comments
at a glance, I see you're missing the ";" at the end of the script (prior to the "return false;"
Also your script end tag has ended up in the wrong place
do you have download'able code for this`?
The example seems rather unfinished...
I don't see the jquery being called anywhere...
method parameter are showing null after post.
UploadAttachment(String FirstName, String LastName, HttpPostedFile Attachment)
$.ajaxFileUpload(
{
url: "/ContactSubmission/UploadAttachment",
secureuri: false,
fileElementId: 'Attachment',
dataType: 'json',
data: {
FirstName: $('#FirstName').val(), //you can declare the other form elements here
LastName: $('#LastName').val()
},
success: function(data, status) {
alert(data);
if (typeof(data.error) != 'undefined') {
if (data.error != '') {
//alert(data.error);
} else {
//alert(data.msg);
}
}
},
error: function(data, status, e) {
//alert(e);
}
}
);
Post a Comment