多维数组文件上传

时间:2014-05-02 16:23:56

标签: php arrays file-upload multidimensional-array upload

我目前正在开发一个脚本,用户可以在该脚本中向表单添加字段组并包含图像 问题是我不知道从哪里开始在多维数组中上传文件。

到目前为止,我已经构建了表单:http://letsfixit.co.uk/fortest.php并让它使用添加字段组并创建数组,但到目前为止还没有任何关于获取文件的信息。我只能看到它将文件名作为字符串存储在数组中,就是它!

有没有办法使用foreach语句,只使用php的普通文件上传方法?像修改版本的东西:

if ($_FILES["file"]["error"] > 0) {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
  } else {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
    if (file_exists("upload/" . $_FILES["file"]["name"])) {
      echo $_FILES["file"]["name"] . " already exists. ";
    } else {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
    }
  }

我遇到的唯一问题是当表单发布时,$ _FILES中没有任何内容,它只是一个空数组

1 个答案:

答案 0 :(得分:1)

这是最后的编辑 -

您错过了表单中的“enctype”选项:

我无法让你的php脚本工作。这是一种方法......

imo,你在客户端工作太辛苦了。 PHP将为您整理输入字段数组。目前,在客户端上,您正在尝试通过生成自己的索引来组织每个步骤的所有数据。我建议不要打扰。使用数组窗口小部件名称但固定的名称,并收集每个步骤服务器端的所有数据。它简化了您的javascript,因为您只是复制字段组但不更改名称。

Serverside PHP将所有输入排列在单独的数组中。这很好,因为每个数组的第一行是第1步,第二行是“第2步”等。

无论如何,这是一个“两步”形式和上传脚本,可以运行并且已经过测试。

<?php
if (!empty($_FILES)) {

    // var_dump($_POST);

    // foreach($_FILES as $key => $value){
    //    var_dump($key, 'the key', $value, 'the value');
    // }
    // var_dump($_FILES["steps"]["error"]["image"], '$_FILES["steps"]["error"]["image"]');

    // all valid steps in here...
    $theOutputSteps = array();

    /*
     * Please note there are separate arrays.
     * But any ONE index value across all arrays is the complete record!
     *
     * This works 'cos empty values still come in and php makes them...
     */

    // we need to pick something to drive off... I use '$_POST[steps][title].
    // It does not matter as all the input arrays are the exact same size.

    /*
     * let us start to reassemble the information into a useable form...
     */
    foreach($_POST['steps']['title'] as $key => $value) {
        $curStep = array();
        $curStep['title'] = $value;
        $curStep['description'] = $_POST['steps']['description'][$key];

        // file details...
        $curStep['image']['error'] = $_FILES["steps"]["error"]["image"][$key];
        if (!$curStep['image']['error']) { // save the file
            $curStep['image']['name']      = $_FILES["steps"]["name"]["image"][$key];
            $curStep['image']['type']      = $_FILES["steps"]["type"]["image"][$key];
            $curStep['image']['size']      = $_FILES["steps"]["size"]["image"][$key];
            $curStep['image']['tmp_name']  = $_FILES["steps"]["tmp_name"]["image"][$key];

            if (!file_exists('./upload/'.$curStep['image']['name'])) {
                 move_uploaded_file($curStep['image']['tmp_name'],
                 './upload/'.$curStep['image']['name']);
            }
            else {
                 $curStep['image']['error'] = "file already exists: ". $curStep['image']['name'];
            }
        }

        $theOutputSteps[] = $curStep;
    }
    var_dump($theOutputSteps, '$theOutputSteps');
}
?>

<form id="steps" method="POST" action="" enctype="multipart/form-data">
    <div id="p_scents">
        <p>
                <label for="p_title_scnt"><input type="text" id="p_title_scnt" size="20" name="steps[title][]" value="Step 1" placeholder="Input Value" /></label> <br />
                <label for="p_step_scnt"><textarea id="p_step_scnt" name="steps[description][]" ></textarea></label> <br />
                <label for="p_image_scnt"><input type="file" id="p_image_scnt" name="steps[image][]" value="" /></label>
        </p>
        <p>
                <label for="p_title_scnt"><input type="text" id="p_title_scnt" size="20" name="steps[title][]" value="Step 2" placeholder="Input Value" /></label> <br />
                <label for="p_step_scnt"><textarea id="p_step_scnt" name="steps[description][]" ></textarea></label> <br />
                <label for="p_image_scnt"><input type="file" id="p_image_scnt" name="steps[image][]" value="" /></label>
        </p>
    </div>
    <a href="#" id="addScnt">Add Another Input Box</a><br /><br />
    <input type="submit" value="Post Guide">
</form>