How to upload files using ajax to asp.net mvc controller action

前端 未结 2 445
故里飘歌
故里飘歌 2020-11-30 10:33

I have this submit code,

$(\'#form\').on(\'submit\',function (e) {
    e.preventDefault();
    //var file = $(\"#productImg\");
    var fileUpload = $(\"#pr         


        
相关标签:
2条回答
  • 2020-11-30 11:26

    For ASP.NET Core, you can do this by starting with your model:

    public class FilesViewModel
    {
        public Guid? ParentObjectId { get; set; } // if you wish to associate these files with some parent record
        public IEnumerable<IFormFile> Files { get; set; }
    }
    

    Your controller:

    [HttpPost]
    public JsonResult UploadFiles(FilesViewModel model)
    {
        if (ModelState.IsValid)
        {
            // your code here
            // see https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads
        }
    }
    

    Your view (or view component):

    @model YourProject.ViewModels.EventFilesViewModel
    <form method="post" enctype="multipart/form-data">
        <input type="hidden" asp-for="ParentObjectId" />
        <input type="file" asp-for="Files" multiple />
        <span asp-validation-for="Files" class="text-danger"></span>
        <input type="button" id="btnEventFilesUpload" value="Upload Selected Files" class="btn btn-default" />
    </form>
    

    And, finally, the javascript (as modified from Shyju's answer to pass the ParentObjectId):

    $(function () {
        $("#btnEventFilesUpload").click(function (evt) {
            var fileUpload = $("#Files").get(0);
            var files = fileUpload.files;
            var data = new FormData();
            for (var i = 0; i < files.length; i++) {
                data.append('Files', files[i]);
            }
            // if you wish to associate these files with some parent record
            data.append('ParentObjectId', $('#ParentObjectId').val());
            $.ajax({
                type: "POST",
                url: "/Event/UploadFiles",
                contentType: false,
                processData: false,
                data: data,
                success: function (message) {
                    alert(message);
                },
                error: function () {
                    alert("There was error uploading files!");
                }
            });
        });
    });
    
    0 讨论(0)
  • 2020-11-30 11:30

    Unfortunately the jQuery serialize() method will not include input file elements. So your files are not going to be included in the serialized value.

    What you can do is, creating a FormData object, append the files to that. You need to append the form field values as well to this same FormData object. You may simply loop through all the input field and add it.

    When you add the files to form data, you need to give a name which will match with the parameter you will use in your HttpPost action method.

    This should work.

    var fileUpload = $("#productImg").get(0);
    var files = fileUpload.files;
    
    var formData = new FormData();
    
    // Looping over all files and add it to FormData object  
    for (var i = 0; i < files.length; i++) {
        console.log('(files[i].name:' + files[i].name);
        formData.append('productImg', files[i]);
    }
    
    // You can update the jquery selector to use a css class if you want
    $("input[type='text'").each(function (x, y) {
        formData.append($(y).attr("name"), $(y).val());
    });
    
    $.ajax({
        type: 'POST',
        url:  'ReplaceHereYourUrltotheActionMethod',
        data: formData,
        processData: false,
        contentType: false,
        success: function (data) {
        }
    });
    

    and your action method, You can add another parameter of type IEnumerable<HttpPostedFileBase> with the name same as what we set to form data, which is productImg.

    [HttpPost]
    public virtual ActionResult Index(ProductModel model, 
                                                   IEnumerable<HttpPostedFileBase> productImg)
    {
      // to do :Look through productImg and do something  
    }
    
    0 讨论(0)
提交回复
热议问题