发送多部分表单数据后,php响应标头中没有显示任何内容

时间:2018-04-11 16:30:50

标签: javascript php ajax

我有以下文件。开发人员工具的Response标头中没有显示任何内容。我期待与文件相关的变量并在我的accept.php页面中发布。

我可以看到console.log(formData);正在打印,但console.log(returndata);

1)send.php档案

<?php

echo ' 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

<script type="text/javascript" src="file.js"></script>

<form id="data" enctype="multipart/form-data">
      <input type="hidden" name="id" value="123" readonly="readonly">
      User Name: <input type="text" name="username" value=""><br />
      Profile Image: <input name="profileImg[]" type="file" /><br />
      Display Image: <input name="displayImg[]" type="file" /><br />
      <button  type = "button" onclick="submitFileTest()">Submit Button  </button>
    </form>';

?>

2)file.js

function submitFileTest() { 


          //grab all form data  
          var formData = new FormData($(this)[0]);

          console.log("Form Data Test");
          console.log(formData);

          $.ajax({
            url: 'accept.php',
            type: 'POST',
            data: formData,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: function (returndata) {
              //alert(returndata);
              console.log(returndata);
            }
          });




 }

3)accept.php

<?php


        if (isset($_POST['id'])) {                      
            $id = $_POST['id'];
            var_dump($id);
            echo $id;
        }


        if (isset($_POST['username'])) {
           $username = $_POST['username'];
           var_dump($username);
           echo $username;
        }


        if (isset($_FILES['profileImg'])) {
            $profileImg = $_FILES['profileImg'];
            var_dump($profileImg);
            echo $profileImg;
        }

        if (isset($_FILES['displayImg'])) {
             $displayImg = $_FILES['displayImg'];
             var_dump($displaying);
             echo $displayImg;
        }

?>

测试结果(使用Popmedic答案后):

在测试之前,对于displayImg,我将以下行formData.append('displayImg', $('input[type=file]')[1].files[0]);中的文件数组值从0更改为1,如下所示formData.append('displayImg', $('input[type=file]')[1].files[1]);

我能够在php脚本中看到id值,username值和profileImg值,如下面IE11控制台窗口的屏幕截图所示。但由于某种原因,代码没有获取第二个文件displayImg

enter image description here

以下是IE11 Request body的屏幕截图,显示文件displayImg没有任何内容。

enter image description here

关于Popmedic评论的澄清(4月18日):

我已使用this solution合并了POST和FILEs结果,并以JSON格式获得了以下内容:

{"id":"123","username":"123","profileImg":{"name":"Request_body.PNG","type":"image\/png","tmp_name":"C:\\wamp\\tmp\\phpA981.tmp","error":0,"size":15842},"displayImg":{"name":"Request_body.PNG","type":"image\/png","tmp_name":"C:\\wamp\\tmp\\phpA9A1.tmp","error":0,"size":15842}}

我已经有一个Java webservice工作,它接受一个JSON对象并以CLOB的形式存储在Oracle数据库中。这就是我合并并转换为JSON的原因,如上所示。我想在上面从代码行$str获得的JSON响应中包含变量$str = file_get_contents($_FILES["displayImg"]["tmp_name"]);值,这样除了上面的JSON之外,我还可以将文件内容包含到webservice中, Java Web服务将确保将其插入Oracle数据库。最终我的cuRL请求看起来像这样:

                      $curl = curl_init();
                      curl_setopt_array($curl, array(
                      CURLOPT_PORT => "9090",
                      CURLOPT_URL => "http://localhost:9090/myJavaWebservice/rest/somepath/insertDataToDB",
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_ENCODING => "",
                      CURLOPT_MAXREDIRS => 10,
                      CURLOPT_TIMEOUT => 30,
                      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                      CURLOPT_CUSTOMREQUEST => "POST",
                      CURLOPT_POSTFIELDS => $_POST["myData"],
                      CURLOPT_HTTPHEADER => array(
                        "Cache-Control: no-cache",
                        "Content-Type: application/json"

                        ),
                      ));

                    $response_post_march22 = curl_exec($curl);
                    $err = curl_error($curl);

                    curl_close($curl);

                    if ($err) {
                      echo "cURL Error #:" . $err;
                    } else {
                      echo $response_post_march22;
                    } 

我已经有上面的curl请求工作并将数据插入到数据库中但是现在而不是myData JSON object,我将传递新的JSON,我在合并之后创建了使用$str变量获取的文件内容,以便可以将所有内容存储到数据库中。

1 个答案:

答案 0 :(得分:0)

也许在标题中设置一些内容供您查看...

if (isset($_POST['id'])) {                      
    $id = $_POST['id'];
    header ("ID: $id");
    var_dump($id);
    echo $id;
}else {
    header ("ID-Present: Nope");
}


if (isset($_POST['username'])) {
    $username = $_POST['username'];
    header ("User-Name: $username");
    var_dump($username);
    echo $username;
}else {
    header ("User-Name-Present: Nope");
}


if (isset($_FILES['profileImg'])) {
    $profileImg = $_FILES['profileImg'];
    header ("Profile-Image-Present: Yep");
    var_dump($profileImg);
    echo $profileImg;
} else {
    header ("Profile-Image-Present: Nope");
}

if (isset($_FILES['displayImg'])) {
    $displayImg = $_FILES['displayImg'];
    header ("Display-Image-Present: Yep");
    var_dump($displayImg);
    echo $displayImg;
} else {
    header ("Display-Image-Present: Nope");
}

更新显示如何设置查询参数

如果您希望标题是其他标题,那么&#34; Nope,&#34;你需要在你的javascript AJAX请求中发送这些值,如下所示:

function submitFileTest() { 
    var formData = new FormData();
    formData.append('id', $('[name="id"]').val());
    formData.append('username', $('[name="username"]').val());
    // Attach file
    formData.append('profileImg', $('input[type=file]')[0].files[0]);
    formData.append('displayImg', $('input[type=file]')[1].files[0]); 
    console.log("Form Data Test");
    console.log(formData);

    $.ajax({
        url: 'accept.php',
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function (returndata) {
          //alert(returndata);
          console.log(returndata);
        }
      });
}

最新使用get_file_post_data来自其他SOLUTION

我相信如果您更改other solutions get_file_post_data函数(我必须从此函数中删除一些无用的代码,这让我太烦了):

function get_file_post_data() {
    $files = array();
    $post = $_POST;
    foreach ($_FILES as $key_a => $data_a) 
        foreach ($data_a as $key_b => $data_b) {
            // Add this --->
            if ($key_b == 'tmp_name')
                $files['data'][$key_a] = base64_encode(file_get_contents($data_b));
            // <--- end
            $files[$key_b][$key_a] = $data_b;
        }
    foreach ($files as $type => $data) merge_file_post_data($type, $data, $post);
    return $post;
}

然后,当您使用json_encode(get_file_post_data(), JSON_PRETTY_PRINT);之类的内容转换为JSON时,您将拥有如此的JSON:

{
    "id": "123",
    "username": "kevin",
    "profileImg": {
        "name": "suggestions@1.png",
        "type": "image\/png",
        "data": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAAe1JREFUOBGNlLtKXUEUhr3FGxowCnaCjVaiQghaW6SzsNDCNHkCfQcrJa1YaGNhL1j4AClTJCkkBDmCCEE0ihfQqHj5\/j3rD\/ucfY664JuZdZ01s+ecurqiNIapm3kFSnAJF7ALS9AGkqY01R5dbJyQa\/gGszAMI\/AZfsERDIDEOUnLjQ2x7mO+h4Wcr3K5huEcOsJRXxkg3Tttsd6OAB3pTfjkbw67pu+wGnrh6O5O93YGH2oFYtcGkkk4BhfLunQhtzxIwBXoniQ6eqXY9hOH8vsjoKygk2QUjzY8Mz9EbFbIce7QBXZwtIK+qMT3mrQ0OmcM9Q70lCSukTRGJ2+w\/hpWJzso381vjF\/C4Xt0XDY7uQftH8yFNx\/sTRfx6YNYz28UaWly8hSqinaFVwneUA9aH0aPX+KcpFWM+Z328c2EX++vJdbzzD9i7Q5DLVbXxaqo5r\/wFiS3acpG2fTTk+QbyAzV2nVBHes9bEIvyH4Io3ADrxYf4xMZZ1CCvZj1RP7AR5A4NmmMhZb\/e9JCb+0d6OemO+yEE1DXVeW5I7eTMQEqqF+FRI\/+APTF\/Uspe9DVChKbiRL0pyr0hHRvsukavEFZMew1j+wOhohZh1OQTVc0DXrUjmH5svhudenLoI701fULsY9lUZ4ALVRR18zk4X0AAAAASUVORK5CYII=",
        "tmp_name": "\/private\/var\/tmp\/phpBU7D0c",
        "error": 0,
        "size": 941
    },
    "displayImg": {
        "name": "suggestions@2.png",
        "type": "image\/png",
        "data": "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM\/rhtAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAABKNJREFUWAm9mE+IVmUUxsfUSE1z\/ItSKDRRLQzUJEkmQhqw2rgRwtoULQo3ga3CxbRS3AiCQguXs3CRqIgEIjYjEU1GFEHOxjFwSqQazb+NTvb8vnue2535\/r33fkMHnnve97znPPe8533fe+\/3zeoqJ4\/IfZYwGWF90m8KG4Q1wiqBsSvCZeEb4aQwLCBzBMYf0plpmV0g3K72dwI3SsEZ+W0WECbIRJME5xQhOWaO\/xHhXcEypMY54WfhZhiXSL8gvCasDxuqX\/iUhoQk\/6m1Orx4tnPFQyKu2Cm1NyVwb5PPt4U4JmhJLZD96zQEJmEvObndBU\/G2VuASgP31czlkFqO3x\/W4rbJHcs0uBHysWDyD2qWbIk8HqY6RfJU3nJADfO8EcZ2HI6t017a1RoZFyA+HF6QurJhaqmKlTorT7h+EMxh3ZJk+qBn1q8BCH8VugXEyWe9tKv5ODQcDjh3RKjHopuumNn3AmR7I6wymeJdyRPBeTQ4bY9ue+UKPS\/X+wIJbomw0mQRh\/Lk3lMbzlHhcQFpuMxOJHP572p7j0yQXhNGYriTZxdJIew\/5CnhyVqrZIIR07UsGr9L37CxA+0E4bsjsBrdwVeqghHTuOwe7ECTqJNtmJi5vZTuT9csLbJcWFxrdXZxMitEs0B4IPwRlE44uplqlqD32UW5\/S2Q4LospNIjJkLzFXkpDKPSv0S7YYIObKQ92680SPBn4eST2Cimnc2cg3KE0+\/lSpwO2hVkt6V7BKTKo8avPD4eSA5sFZAqfPlyzBfBJQHCzwWk2dbIRuuv9qeCPGLg4hsR8VjWK3l1Fd9WnGf9YXC4IimUrtDB4GGPb4xAj6XwNPTxDAc0SpITwovhmULuSe6MeDj2RLzHoltNOcHHFP6jwA3OJ1L5UDwh\/7GIPVGI9XjBVK3p5XwlbkKSLwdVqyq6Qu9H3J\/SfL4hreIyD11dndzQpMEDFRkSLtRaXV29oVM47HtaMXy2kfhkxLdUKeQQUDHP+KdgfCY0Y83ESTwdDpzgUpKaIKTeL1fjDv6QaJYg\/oxRLX7lIY7NeglX75EE19yFrxBkXqaabhMSZGtwuADi2KyXcK2SoPejl5wP2lbCG8j38ZK38p8y5sApxjYdNjnyrPCqwI91eKYvNduHivFVvlJAfstUnW+YO1Per\/z\/cksgoTLgcJnD+1mmmRUvK28FqgPuCvcCfJoVgX1C4LvS\/82YQ6b2UmUmPp0LRc9BYQ9SSfYX71jaaIQ2CflwUEGPqdlequxBbsqNuDGnc6lAsosEXmlFYOfNMSL0C6WSk39+uminiKvHT8WvhbUC+5HqsbQsN6eWg\/OXcD36vIcRx2e9hCsBVYXK8Y4mMaoKF1XFRmVZfr4leUiPC\/zDVVrKJugK8INnQHhOYJuQzKPRZvm9D0mehL8Q3hEcr2aaVNmDMHMyjwskMCZ4WVluwKHwA13NXEi8lJStoMldiT4ZegUeJ1SK6hkkw8HhZ8Jg2EsfEsVVElf+E0WTSCu8Hnco9fyrlFUhqFj5Y4UEWVZOtBPeFzFU9X+XYpIf6e7DAvuPE\/ul8JZgKfralqT\/BVPW\/p9Rsv1pAAAAAElFTkSuQmCC",
        "tmp_name": "\/private\/var\/tmp\/php3kezNJ",
        "error": 0,
        "size": 1635
    }
}

如果您希望将响应时间缩短一半,可以尝试在PHP中执行一些poorman's threading ...