【问题标题】:php doesn't parse data from multipart/form-data form's data sent by ajaxphp 不解析来自 ajax 发送的 multipart/form-data 表单数据的数据
【发布时间】:2014-09-10 10:02:34
【问题描述】:

我在 html 中有这个表单,它同时包含文件和其他输入元素:

<form action="/imsick/disease/add" id="addDisease" method="post" role="form" data-async="" enctype="multipart/form-data">
<input type="text" id="name" name="name" class="form-control">
<textarea id="description" name="description" class="form-control" rows="10"></textarea>
<input type="checkbox" name="category[]" value="3">
<input type="checkbox" name="category[]" value="5">
<input type="checkbox" name="category[]" value="6">
<input type="checkbox" name="category[]" value="4">
<input type="checkbox" name="category[]" value="1">
<input type="checkbox" name="category[]" value="7">
<input type="checkbox" name="category[]" value="2">
<input type="file" id="approach-file" name="approach">

<input type="checkbox" name="symptom[0][is_patogonomic]">
<input type="text" name="symptom[0][name]" class="form-control typeahead" typeahead-source="http://localhost/imsick/symptom/search">

<input type="checkbox" name="symptom[1][is_patogonomic]">
<input type="text" name="symptom[1][name]" class="form-control typeahead" typeahead-source="http://localhost/imsick/symptom/search">

<input type="text" name="lab_symptom[0][name]" class="form-control typeahead" typeahead-source="http://localhost/imsick/labsymptom/search">
<select name="lab_symptom[0][anomaly_type]" class="form-control">
    <option value="ABOVE">ABOVE</option>
    <option value="UNDER">UNDER</option>
    <option value="POSITIVE">POSITIVE</option>
    <option value="NEGATIVE">NEGATIVE</option>
    <option value="++">++</option>
</select>
<input type="submit" class="btn btn-default center-block">
</form>

这是我通过 ajax 提交表单数据的 javascript/jquery 代码:

$('form[data-async]').on('submit', '', function(event) {
//form data object
event.preventDefault();
var $form = $(this);
var __fd = new FormData($form[0]);
$.ajax({
    type: $form.attr('method'),
    url: $form.attr('action'),
    data: __fd,
    processData: false,
    beforeSend: function(xhr) {
        //not important
    },
    success: function(data, status) {
        data = $.parseJSON(data);
        if (data.success) {
            //not important

        } else {
            //not important
        }
    },
    error: function() {
        //not important
    }
});
return false;
});

提交数据后,在表单的目标 URL 上执行var_dump($_POST),将得到以下信息:

        array(2) {
      ["_url"]=>
      string(12) "/disease/add"
      ["------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition:_form-data;_name"]=>
      string(1404) ""name"

    asdasdaasdasdasdasda
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="description"

    asdsad
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="category[]"

    5
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="category[]"

    4
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="category[]"

    1
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="category[]"

    7
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="approach"; filename=""
    Content-Type: application/octet-stream


    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="symptom[0][is_patogonomic]"

    on
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="symptom[0][name]"

    asdasd
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="symptom[1][is_patogonomic]"

    on
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="symptom[1][name]"

    asdasd
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="lab_symptom[0][name]"

    asdasdasd
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN
    Content-Disposition: form-data; name="lab_symptom[0][anomaly_type]"

    ABOVE
    ------WebKitFormBoundaryHmT1pwGJDYbVxvrN--
    "
    }

似乎 php 不解析这些数据并且 $_POST 数组只有两个成员。 谁能告诉我我做错了什么?

谢谢

【问题讨论】:

    标签: javascript php jquery ajax forms


    【解决方案1】:

    尝试添加contentType: false

    $.ajax({
        type: $form.attr('method'),
        url: $form.attr('action'),
        data: __fd,
        processData: false,
        contentType: false ,  // tell jQuery not to set contentType
        beforeSend: function(xhr) {
       //not important
        },
        success: function(data, status) {
        data = $.parseJSON(data);
        if (data.success) {
            //not important
    
        } else {
            //not important
        }
    },
    error: function() {
        //not important
    }
    

    });

    【讨论】:

    • 您能详细说明为什么这可以解决问题吗?
    • processData - jQuery 将数组数据转换为字符串。所以我们无法从服务器接收文件。 contentType - 设置为 false,因为 jQuery 将内容设置为 application/x-www-form-urlencoded。所以文件不会发送到服务器
    猜你喜欢
    • 2012-10-01
    • 2016-07-13
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2021-04-30
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多