Monday, 16 March 2015

Submit form with file and complex data using ajax mvc web api

 

This is common problem developer faced during development that how to upload file with complex data. I was one of them. So to solve this I searched a lot and but did not get satisfied answer. Then I combined many of answer and solve my problem. I am sharing my code here.

Very first my web api code is as below:

public HttpResponseMessage UploadData()
        {
            try
            {
                //if (HttpContext.Current.Request.Files.AllKeys.Any())
                if (HttpContext.Current.Request.Form.AllKeys.Any())
                {
                    var Title = HttpContext.Current.Request.Form["Title"];
                    var Id = HttpContext.Current.Request.Form["Id"];
                    var H2 = HttpContext.Current.Request.Form["H2"];
                    var H3 = HttpContext.Current.Request.Form["H3"];
                    var P = HttpContext.Current.Request.Form["P"];
                    var pic = new HttpPostedFileWrapper(HttpContext.Current.Request.Files["Picture"]);

                    return Request.CreateResponse(HttpStatusCode.OK, "Successfully uploaded");

                }
                else
                {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Please enter information to submit");
                }
            }
            catch (System.Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
        }

 

Now HTML form that we are using to take data:

@model Admin.Models.UploadData

<form id="frmData" name="frmData" method="post" enctype="multipart/form-data" >

@Html.TextBoxFor(model => model.ImageUpload, new { type = "file", id = "ImageUpload", name = "ImageUpload", @class = "default" })

@Html.TextBoxFor(model => model.Title, new { id = "Title", name = "Title", @class = "m-wrap span12" })

@Html.TextBoxFor(model => model.H2, new { id = "H2", name = "H2", @class = "m-wrap span12" })

@Html.TextBoxFor(model => model.H3, new { id = "H3", name = "H3", @class = "m-wrap span12" })

@Html.TextBoxFor(model => model.P, new { id = "P", name = "P", @class = "m-wrap span12" })

<span id="spnError" class="field-validation-error"></span>

<button type="submit" id="btnSubmit" class="btn blue"><i class="icon-ok"></i> Save</button>

</form>

 

Now Its time to call web api from Ajax

 

$('#btnSubmit').click(function (e) {
    e.preventDefault();
    if ($('#ImageUpload').val() == "" && $('#Id').val() == "0") {
        $('#spnError').text("Please select image");
        return false;
    }
    else {
        if ($('#ImageUpload').val() != "") {
            var fileExtension = ['jpeg', 'jpg'];
            if ($.inArray($('#ImageUpload').val().split('.').pop().toLowerCase(), fileExtension) == -1) {
                $('#spnError').text("Only '.jpeg','.jpg' formats are allowed");
                return false;
            }
            else {
                var fsize = $('#ImageUpload')[0].files[0].size;
                if (fsize > 1048576) //do something if file size more than 1 mb (1048576)
                {
                    $('#spnError').text("Max image size limit is 1 MB");
                    return false;
                }
            }
        }
    }
    if ($('#Title').val() == "") {
        $('#spnError').text("Please enter Title");
        return false;
    }

    var data = new FormData();
    var files = $("#ImageUpload").get(0).files;
    if (files.length > 0) {
        data.append("Picture", files[0]);
    }

    data.append("Title", $('#Title').val());
    data.append("Id", $('#Id').val());
    data.append("H2", $('#H2').val());
    data.append("H3", $('#H3').val());
    data.append("P", $('#P').val());

    $(this).html("<i class='icon-refresh'></i> processing");

    $.ajax({
        url: "@Url.Action("UploadData", "api/Webapi")",
        type: "POST",
        processData: false,
        contentType: false,
        data: data,
        success: function (response) {
            //code after success
            $('#btnSubmit').html("<i class='icon-ok'></i> Save");

alert(response);

        },
        error: function (response) {
            $('#btnSubmit').html("<i class='icon-ok'></i> Save");
            if ((JSON.parse(response.responseText).Message).indexOf("login") >= 0) {
                window.location = "@Url.Action("Index","Home")";
            }
            else {
                $('#spnError').text(JSON.parse(response.responseText).Message);
            }
        }
    });

  });

 

That’s it … Enjoy coading…