我的PHP代码上传不会上传所有文件

时间:2014-02-21 10:25:45

标签: php file-upload

[问题是本地问题。我将代码上传到学校的服务器,代码每次都有效。感谢你们的所有答案和时间,他们帮助我清理代码,现在看起来更好。]

我的PHP代码上传不会上传所有文件,只会上传一些文件 我的设置页面设​​置为4个上传框。我的index.php工作正常,它会将所有4 $_FILES个信息发送到upload.php,但当upload.php获取时,它只上传2个或1个文件,有时全部4个但不会所有文件一直都在。

我已经检查过,foreach loop工作正常。

这是我的代码:

的index.php

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>

        <form method="POST" action="upload.php" enctype="multipart/form-data">

        <?php
        $RawSettings= file_get_contents('settings.txt');
        $settings = explode('=', $RawSettings);

        for ($x=1;$x<="$settings[1]";$x++)
        {
            echo '<input type="file" name="image'.$x.'"> <br>';
            echo $x.'<br>';
        }

        ?>

            <input type="submit" value="Upload">
        </form>
    </body>
</html>

upload.php的

<?php

$x=1;
foreach($_FILES as $image) {

    $varname = $_FILES['image'.$x]['tmp_name'];
    $vartype = $_FILES['image'.$x]['type'];
    $type = explode('/', $vartype);

    if ($type[1] == 'jpeg' || $type[1] == 'png')
    {
        $name = uniqid('picture');
        move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1] );
    }

    echo $x . '<br>';
    echo $varname . '<br>';
    $x++;

}

提前感谢您至少阅读我的问题。这些文件具有调试回声,只是为了查看循环是否正常工作。

EDIT2
这是print_r($type)

的输出
        1
C:\xampp\tmp\php253.tmp
Array
    (
        [0] => image
        [1] => jpeg
    )
    2
C:\xampp\tmp\php264.tmp
Array
    (
        [0] => image
        [1] => jpeg
    )
    3
C:\xampp\tmp\php275.tmp
Array
    (
        [0] => image
        [1] => jpeg
    )
    4
C:\xampp\tmp\php276.tmp
Array
    (
        [0] => image
        [1] => jpeg
    )

2 个答案:

答案 0 :(得分:1)

     foreach($_FILES as $image) {

$varname = $image['tmp_name'];
$vartype = $image['type'];
$type = explode('/', $vartype);

if ($type[1] == 'jpeg' || $type[1] == 'png') {
    $name = uniqid('picture');
    move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1] );
 }
 }

希望它能帮到你

答案 1 :(得分:0)

首先,您不需要$x中的foreach,因为$image已填充$_FILES["image".numer]。如果您想检查密钥是否以图片开头,您可以使用strpos($key, 'image') === 0

您可能发送的文件的起始名称不是“image”,在这种情况下$x将递增,如果发送4个非图像文件,PHP将尝试读取不存在的文件$_FILES["image5"] 这是检查文件类型的更安全的方法:

$finfo = new finfo(FILEINFO_MIME);
$mimetype = $finfo->file($image['tmp_name']);

但这只适用于PHP&gt; = 5.3.0 你应该使用$ image ['tmp_name']而不是$_FILES["image".$x]["tmp_name"]

foreach($_FILES as $key => $image){
    if(strpos($key, 'image') !== 0) continue; //Check if "image" is at the beggining of the key
    $varname = $image['tmp_name']; //Get the temp name
    $finfo = new finfo(FILEINFO_MIME); //Make an instance of the finfo class with mime mode
    $vartype = $finfo->file($image['tmp_name']);//Get mimetype of tmp_name
    $type = explode('/', $vartype); 

    if (substr($type[1], 0, 4) == 'jpeg' || substr($type[1], 0, 3) == 'png')
    {
    $name = uniqid('picture');
    move_uploaded_file($varname, 'uploads/' . $name . '.' . $type[1].'NOPHP');
    }

    //echo $varname . '<br>';


}

另外,使用explode('=', $RawSettings),您只能加载一个设置,并且,如评论者所述,您应该从$x<="$settings[1]“删除doule引号。