【问题标题】:All images not uploading in multiple images upload多张图片上传中所有图片未上传
【发布时间】:2015-11-09 16:41:28
【问题描述】:

我正在尝试上传多个文件,它可以很好地上传它们。但我也在检查错误(类型和大小)并捕获数组变量中的错误。当我选择 3 张图片时,其中一张有一些错误(大于允许的尺寸和/或不允许的类型),它是第一张图片,然后其他两张图片也没有上传。如果有错误的文件是第二个,那么只有第一个被上传,当错误图像是最后一个时,前两个被上传。我想要做的是,即使一张或多张图片有错误,其他有效图片也应该上传,无论它们被选中的顺序如何。

这是我的脚本:

function filesupload($files) // here files is $_FILES array
{

    $i = 0;
    $errors = array();
    $maxfilesize = 1*1024*1024; // 1 MB
    $num = count($files['name']);
    $allowed_types = array('image/jpeg', 'image/png');

    foreach($files['tmp_name'] as $key=>$tmp_name)
    {
        $tmpname = $files['tmp_name'][$key]; // file temp name
        $fsize = $files['size'][$key];  // file size

        if(!empty($files['name'][$key]))
        {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $ftype = finfo_file($finfo, $files['tmp_name'][$key]); // file mime type
        }

        //validations for file type and size

        // no file selected
        if(empty($files['name'][$key]))
        {
            $errors[] = 'Select at least one file for uploading';
        }

        // file type not allowed
        if(in_array($ftype, $allowed_types) === false)
        {
            $errors[] = 'One or more files have invalid file extension';
        }

        // file size validation
        if($fsize > $maxfilesize)
        {
            $errors[] = 'Size of one or more files is more than allowed';
        }

        // if no errors uploaded file(s)
        if(empty($errors))
        {
            $path = 'images/';
            $newfilename = time().'_'.rand(100000, 999999).'_'.$files['name'][$key];
            $move = move_uploaded_file($tmpname, $path.$newfilename);
            if($move)
            {
                $i = $i + 1;
                if($i == $num)
                {
                    $msg = 'Files uploaded';
                    return $msg;
                }
            }
        }
        elseif(!empty($errors))
        {
            return $errors;
        }
    }

}

【问题讨论】:

    标签: php image-uploading


    【解决方案1】:

    在循环中您检查了$error[]。因此,当错误出现在第一个文件中时,数组不会为空,其他图像不会上传。

    尝试如下:

    function filesupload($files) // here files is $_FILES array
    {
        $i = 0;
        $errors = array();
        $maxfilesize = 1*1024*1024; // 1 MB
        $num = count($files['name']);
    
        $allowed_types = array('image/jpeg', 'image/png');
    
        foreach($files['tmp_name'] as $key=>$tmp_name)
        {
            $tmpname = $files['tmp_name'][$key]; // file temp name
            $fsize = $files['size'][$key];  // file size
    
            if(!empty($files['name'][$key]))
            {
                $finfo = finfo_open(FILEINFO_MIME_TYPE);
                $ftype = finfo_file($finfo, $files['tmp_name'][$key]); // file mime type
            }
    
            //validations for file type and size
    
            // no file selected
            if(empty($files['name'][$key]))
            {
                $errors[$key] = 'Select at least one file for uploading';
            }
    
            // file type not allowed
            if(in_array($ftype, $allowed_types) === false)
            {
                $errors[$key] = 'One or more files have invalid file extension';
            }
    
            // file size validation
            if($fsize > $maxfilesize)
            {
                $errors[$key] = 'Size of one or more files is more than allowed';
            }
    
            // if no errors uploaded file(s)
            if(!isset($errors[$key]))
            {
                $path = 'images/';
                $newfilename = time().'_'.rand(100000, 999999).'_'.$files['name'][$key];
                $move = move_uploaded_file($tmpname, $path.$newfilename);
                if($move)
                {
                    $i = $i + 1;
                    if($i == $num)
                    {
                        $msg = 'Files uploaded';
                        return $msg;
                    }
                }
            }
        }
    
        if(!empty($errors))
        {
            return $errors;
        }
    }
    

    我已将错误消息数组从 $errors[] 更改为 $errors[$key] 并检查了相同的内容。因此,如果您有 4 个文件输入并且第 1 和第 3 有错误,则第 2 和第 4 将上传,并且您将在数组的第 0 和第 2 索引中得到错误。

    【讨论】:

    • 感谢 Ankil。它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多