Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JQuery multipart/data ajax post

Tags:

jquery

php

I am using JQuery to post form data and I have added this into my function to allow it to post / upload files:

mimeType:"multipart/form-data",

I am calling it in my HTML form here:

<form id="form1" method="post" action="/tickets/record?type=<?php echo $_GET["type"]; ?>&seq=<?php echo $_GET["seq"]; ?>" enctype="multipart/form-data" onsubmit="post_form('#form1');">

and trying to handle the attachments in PHP with:

$attachment_array = array();    
foreach($_FILES['ticket_update_files']['name'] as $key => $value) {
    if(!$_FILES['ticket_update_files']['error'][$key]) {

    } 
}

but its not recognising that any files that have been selected.

My full jquery function is:

function post_form(form_id, type, redir_url, loading_modal) {
    type = type || '';
    redir_url = redir_url || '';
    loading_modal = loading_modal || '';

    $( form_id ).submit(function(e) {
        var formObj = $(this);
        var formURL = formObj.attr("action");
        var formData = new FormData(this);

        CheckRequired(e);

        if(loading_modal === '1') { } else {
            LoadModalBody('<h2 align="center">Loading...</h3><p align="center"><i class="fa fa-refresh fa-spin fa-5x"></i></p>', 'Loading');
        }

        $.ajax({
            url : '/section' + formURL,
            type: "POST",
            data : formData,
            mimeType:"multipart/form-data",
            contentType: false,
            cache: false,
            processData:false,
            success:function(data, textStatus, jqXHR) {
                //alert(type);
                if(type === 'modal') {
                    if(redir_url === '') {
                        LoadModal('/section' + formURL, '');
                    } else {
                        LoadModal('/section' + redir_url, '');
                    }
                } else if(type === 'reload') {
                    if(redir_url === '') {
                        location.reload();
                    } else {
                        OpenPage(redir_url);
                    }
                } else {
                    //close the loading modal
                    if(loading_modal === '1') { } else {
                        CloseModal();
                    }
                    //location.reload();
                    //$("body").html(data);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                //if fails
            }
        });
        return false;
        e.preventDefault();
    });
}
like image 775
charlie Avatar asked Jun 08 '16 20:06

charlie


People also ask

What is contentType false in Ajax?

contentType option to false is used for multipart/form-data forms that pass files. When one sets the contentType option to false , it forces jQuery not to add a Content-Type header, otherwise, the boundary string will be missing from it.

What is contentType in Ajax?

contentType is the type of data you're sending, so application/json; charset=utf-8 is a common one, as is application/x-www-form-urlencoded; charset=UTF-8 , which is the default. dataType is what you're expecting back from the server: json , html , text , etc.

How do you serialize multipart form data?

The FormData object can be submitted as-is to some endpoints with a content-type header of multipart/form-data , not not all APIs support that. To serialize a FormData object into a query string, pass it into the new URLSearchParams() constructor.


2 Answers

Use this for Jquery multipart/form-data submission.

$(document).ready(function (e) {
    $("#formid").on('submit', (function (e) {
        e.preventDefault();
        $("#message").empty();
        $('#loading').show();
        $.ajax({
            url: "ajax_php_villa_file.php", // Url to which the request is send
            type: "POST",             // Type of request to be send, called as method
            data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
            contentType: false,       // The content type used when sending data to the server.
            cache: false,             // To unable request pages to be cached
            processData: false,
            beforeSend: function () {
                $('.loader-img').show();
            },     // To send DOMDocument or non processed data file it is set to false
            success: function (data)   // A function to be called if request succeeds
            {
                $('.loader-img').hide();
                if (data.trim() != "")
                    $("#imresss").html(data);
            }
        });
    }));
});
like image 175
Soyab Badi Avatar answered Oct 14 '22 16:10

Soyab Badi


Try to add each file to FormData object manually. Here is how.

HTML:

<form id="my_form" method="post" action="" enctype="multipart/form-data">
    <input type="file" id="my_files" multiple>
    <input type="submit">
</form>

js:

$( "#my_form" ).submit(function(e) {
    e.preventDefault();
    var data = new FormData();
    $.each( $('#my_files')[0].files, function(i, file) {
        data.append('file[]', file);
    });
    $.ajax({
        url: 'http://162.243.221.224/multipart/upload.php', // I will keep this script alive for few weeks
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        // mimeType:"multipart/form-data",
        type: 'POST',
        dataType: "text",
        success: function(data){
            alert(data);
        },
        error: function(data){
            alert(data);
        }
  });
    return false;        
});

PHP:

<?php
    print_r( $_FILES['file']['name'] ); 

Have tested it in Firefox 47.0 with latest jquery. Worked for me (without specifying mimeType in ajax and action attribute in form tag).

like image 31
elshnkhll Avatar answered Oct 14 '22 17:10

elshnkhll