在多维数组中上载多个文件

时间:2015-10-02 11:59:19

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

我有一个包含未知行数的php表单,用户可以在其中上传文件。为此,我使用二维数组。

<form action="upload_file_module.php" method="post" enctype="multipart/form-data">
<? $i = 0; ?>
<table>
    <tr>
        <td>
            <input type="hidden" name="row[<? echo $i; ?>][row_name]" value = "one"/> One
        </td>
        <td>
            <input type="file" name="row[<? echo $i; ?>][fileToUpload]" >
        </td>
        <? 
            $i++;
        ?>
    </tr>

    <tr>
        <td>
            <input type="hidden" name="row[<? echo $i; ?>][row_name]" value = "two"/> Two
        </td>
        <td>
            <input type="file" name="row[<? echo $i; ?>][fileToUpload]" >
        </td>
        <? 
            $i++;
        ?>
    </tr>
</table>    

<input type="submit" value="Upload" name="submit">

所有文件都应保存在不同的文件夹中。

<?php
$unique_id = "folder";
$unique_id = $unique_id . '/';
foreach ( $_POST['row'] as $val )   {

    $target_dir = $unique_id;
    $target_dir = $target_dir . "/" . $val. "/";
    if (!file_exists($target_dir)) {
        mkdir($target_dir, 0777, true);
    }

    echo '<table>';
    echo '<tr>';
    echo '<td>', $val['row_name'], '</td>';
    echo '<td>', $val['fileToUpload'], '</td>';
    echo '</tr>';
    echo '</table>';

    $target_file = $target_dir . basename($_FILES[$val['fileToUpload']]["name"]);
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
    // Check if image file is a actual image or fake image

    // Check if file already exists
    if (file_exists($target_file)) {
        echo "Sorry, file already exists.";
        $uploadOk = 0;
    }
    // Check file size
    if ($_FILES["fileToUpload"]["size"] > 900000000) {
        echo "Sorry, your file is too large.";
        $uploadOk = 0;
    }

    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
        echo "Sorry, your file was not uploaded.";
    // if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.<br>";
        } else {
            echo "Sorry, there was an error uploading your file.<br>";
        }
    }      
}

但实际上它没有看到任何文件,输出如下:

一个

对不起,文件已经存在。对不起,您的文件没有上传。

两个

对不起,文件已经存在。对不起,您的文件没有上传。

1 个答案:

答案 0 :(得分:1)

除了评论中的内容之外,还有一些更改。主要问题是:

  1. 当PHP $_POST$_FILES都是完全分离的实体时,你试图将两个文件和数据发布到一个单独的数组中。因此,当这两个超级全局内部实际存在两个row数组时,您最终会尝试访问单个数组row
  2. 您的$target_file从未被宣布,而您的$target_dir有太多斜杠。
  3. 项目 1 让您以错误的方式访问$val
  4. 这些是我提出的最后修正,保留了适合您自己环境的逻辑。每个部分的解释都在代码中注释。

    HTML表单

    &#13;
    &#13;
    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
    	<form action="upload.php" method="post" enctype="multipart/form-data">
                <table>
    	<?php $counter = 2; // number of fields you want to be printed
    	for($i = 0; $i < $counter; $i++): // do proper counting ?>
                    <tr>
    			<td>
    				<input type="hidden" name="row[]" value="<?php echo $i; ?>"/> File:
    			</td>
    			<td>
    				<input type="file" name="row[]" >
    			</td>
    		</tr>
    	<?php endfor; ?>
    	    </table>
    	    <input type="submit" value="Upload" name="submit">
    	</form>
    </body>
    </html>
    &#13;
    &#13;
    &#13;

    PHP Post Script

    <?php
        $unique_id = "upload"; // just changed to reproduce
        $unique_id = $unique_id . '/';
        foreach ($_POST['row'] as $val)   {
    
            $target_dir = $unique_id;
            $target_file = $_FILES['row']['name'][$val]; //actually defining this var
            $target_dir = $target_dir . $val. "/"; // no need to index assoc nor '/'
            if (!file_exists($target_dir)) {
                mkdir($target_dir, 0777, true);
            }
    
            $imageFileType = pathinfo($target_dir,PATHINFO_EXTENSION);
            // Check if image file is a actual image or fake image
    
            // Check if file already exists
            if (file_exists($target_file)) {
                die("Sorry, file already exists."); // die if error
            }
            // Check file size
            if ($_FILES['row']['size'][$val] > 900000000) { // using the proper index reference for file
                die("Sorry, your file is too large."); //die if error
            }
    
            // Check if there are error msg in $_FILES
            if ($_FILES['row']['error'][$val] != 0) {
                die("Sorry, your file was not uploaded."); // die if error
                // if everything is ok, try to upload file
            } else {
                // point your move_files with the final name of the actual file to be moved
                if (move_uploaded_file($_FILES['row']['tmp_name'][$val], $target_dir.'/'.$_FILES['row']['name'][$val])) {
                    echo "The file ". basename($_FILES['row']['name'][$val]). " has been uploaded.<br>";
                } else {
                    die("Sorry, there was an error uploading your file.");
                }
            }
        }
    

    最终输出(上传两个虚拟文件后)

    Array
    (
        [row] => Array
            (
                [0] => 0
                [1] => 1
            )
    
        [submit] => Upload
    )
    Array
    (
        [row] => Array
            (
                [name] => Array
                    (
                        [0] => dummyfile1.docx
                        [1] => dummyfile2.mpp
                    )
    
                [type] => Array
                    (
                        [0] => application/vnd.openxmlformats-officedocument.wordprocessingml.document
                        [1] => application/vnd.ms-project
                    )
    
                [tmp_name] => Array
                    (
                        [0] => C:\Windows\Temp\php73DA.tmp
                        [1] => C:\Windows\Temp\php73DB.tmp
                    )
    
                [error] => Array
                    (
                        [0] => 0
                        [1] => 0
                    )
    
                [size] => Array
                    (
                        [0] => 0
                        [1] => 180224
                    )
    
            )
    
    )
    The file dummyfile1.docx has been uploaded.
    The file dummyfile2.mpp has been uploaded.