我在PHP中创建了一个FileUploader类,用于验证和上传任何提交的文件。工作正常,但不会移动上载的文件

我在PHP中创建了一个FileUploader类,用于验证和上传任何提交的文件。工作正常,但不会移动上载的文件,php,Php,我正在从事一个项目,因此我正在编写面向对象的PHP。因此,我创建了一个名为FileUploader的类。此类具有验证文件大小、文件扩展名类型以及创建目录(如果不存在)的所有方法。 一切正常,但我注意到它只创建空目录,不移动上传的文件。我尝试从存储属性访问文件错误表单,但它总是给出0作为错误代码 这是FileUploader类 <?php namespace Utility\Classes; class FileUploader { //property declaratio

我正在从事一个项目,因此我正在编写面向对象的PHP。因此,我创建了一个名为FileUploader的类。此类具有验证文件大小、文件扩展名类型以及创建目录(如果不存在)的所有方法。 一切正常,但我注意到它只创建空目录,不移动上传的文件。我尝试从存储属性访问文件错误表单,但它总是给出0作为错误代码

这是FileUploader类

<?php
namespace Utility\Classes;
    class FileUploader
{
    //property declarations
    protected $error_msg = array();
    protected $tmp_file_name;
    protected $max_file_size;
    protected $target_location;
    protected $allowed_file_type = array();
    protected $File;
    protected $default_file_name = true;

    private $backlink_step;
    private $unit_size; //to keep track of measurement unit of upload sizes MB|KB|BYTES


    function __construct(array $file, array $allowed_ext = [], int $file_max_size = 5)
    {

        $this->File = $file;
        $this->backlink_step = '';
        $this->set_allowed_extensions($allowed_ext);
        $this->set_max_upload_size($file_max_size);
    }



    /*This method helps to make sure that files are uploaded to the exact location as desired
    *as in the case of deep nesting of subdirectory process
    */
    function set_backlink_step($prfx)
    {
        $this->backlink_step = $prfx;
    }

    function  set_target(string $target, $dated = false)
    {
        $this->target_location = $target;
        if ($dated) {
            $this->target_location .=  "/" . $date = date("M-Y");
        }
    }

    function get_target()
    {
        return $this->target_location;
    }
    //method to set valid/allowed file types
    function set_allowed_extensions(array $allowed_ext)
    {
        $this->allowed_file_type = $allowed_ext;
    }
    //method to get the allowed file extensions
    function get_allowed_extensions()
    {
        return $this->allowed_file_type;
    }

    function set_error_msg($err)
    {
        $this->error_msg[] = $err;
    }

    function get_error_msg()
    {
        return $this->error_msg;
    }

    function set_file_name($name)
    {
        $this->File['name'] = $name;
    }

    function get_file_name()
    {
        return $this->File['name'];
    }

    function get_tmp_name()
    {
        return $this->File['tmp_name'];
    }

    /**
     * @description: method to return file size in a specified unit
     * @param:String ['TB'|'MB'|'KB'|'B'] default MB
     * @return: Int file size 
     *  */
    function get_file_size(String $unit = "MB")
    {

        if (strtolower($unit) === "tb") {
            $quadrant = 1024 * 1024 * 1024;
        } elseif (strtolower($unit) === "mb") {
            $quadrant = 1024 * 1024;
        } elseif (strtolower($unit) === "kb") {
            $quadrant = 1024;
        } elseif (strtolower($unit) === "b") {
            $quadrant = 1;
        }
        $size = $this->file_size() / $quadrant;
        return number_format($size, 2);
    }

    /**
     * @return int size of the file 
     * */
    function file_size()
    {
        $fsize = $this->File['size'];
        return $fsize;
    }

    /* Method to get the extension name of a file eg: jpg,mp4 */
    function get_ext()
    {
        $extension = explode('.', $this->get_file_name());
        return "." . end($extension);
    }



    function validate($allowed_ext = [])
    {


        //fall back to the object allowed_file_type property if param not set by user
        if (empty($allowed_ext)) {
            $allowed_ext = $this->get_allowed_extensions();
        }

        //validate allowed file type if specified in the array
        if (!empty($allowed_ext)) {
            if (!$this->is_allowed_extension($allowed_ext)) {
                $this->set_error_msg("Type of '{$this->get_file_name()} does not match allowed file types [" . implode('|', $this->get_allowed_extensions()) . "]");
                return false;
            }
        }

        //validate file size
        if ($this->is_above_max_upload_size()) {
            $this->set_error_msg("Size of the file '{$this->get_file_name()}' is larger than max allowed size of {$this->get_max_upload_size()}");
            return false;
        }

        return true;
    }

    /*Method to upload file 
    * @return: the uploaded target location
    */
    function upload_file()
    {
        //create necessary directories if not in existence
        $this->create_dir();
        $target = $this->backlink_step . $this->target_location .  "/" . $this->get_file_name();
        //attempt upload of the file
        if (move_uploaded_file($this->tmp_file_name,  $target)) {
            //update target location with the filename
            return $target;
        } else {
            //return false;
            die("tmp_name: {$this->get_tmp_name()} \n target: {$target} \n Error: {$this->File['error']}");
        }
    }



    /*This method sets the maximum upload size for file track and album_art respectively
    *This method ignores invalid value for unit and replaces it with bytes*/
    function set_max_upload_size($file_size, $unit = "MB")
    {
        $mulitplicant = 1;
        if (strtolower($unit) === "tb") {
            $multiplicant = 1024 * 1024 * 1024;
        } elseif (strtolower($unit) === "mb") {
            $multiplicant = 1024 * 1024;
        } elseif (strtolower($unit) === "kb") {
            $multiplicant = 1024;
        } else {
            $unit = "Bytes";
        }

        $this->max_file_size = $multiplicant * $file_size; //set max size for file
        $this->unit_size = strtoupper($unit);
    }

    function get_max_upload_size()
    {
        return $this->max_file_size;
    }

    /*Method to compare the size of files to be uploaded with the maximum allowed size*/
    function is_above_max_upload_size()
    {
        $file_unit = $this->unit_size;
        //return FALSE if upload size > max size otherwise TRUE
        return ($this->file_size() > $this->get_max_upload_size()) ? true : false;
    }

    /*Method to check if upload file is allowed in by extension name
    *The first paramater takes the string of the actual file extension
    *The second parameter takes an array of allowed extensions
    */
    function is_allowed_extension(array $allowed_ext)
    {
        return (!in_array($this->get_ext(), $allowed_ext)) ? false : true;
    }


//method to create directories
    function create_dir()
    {
        //check if user set a storage location and attempt to create the location
        if (empty($this->get_target())) {
            $this->set_error_msg('Target Not set.');
            return false;
        }
        //Create the directory
        $location = explode('/', $this->get_target());
        $prepend = $this->backlink_step . "";
        foreach ($location as $key => $value) {
            if (!is_dir($prepend . $value)) {
                mkdir($prepend . $value);
            }
            $prepend .= $value . "/";
        }
    }
}

请问我做什么不对??一切正常,验证正在工作,用户可以设置上载目标,如果它不存在,将创建它,但它不会将文件上载到创建的目录或我工作目录中的任何其他位置

我认为您需要更改以下行

 if (move_uploaded_file($this->tmp_file_name,  $target)) {

上传\u文件的方法中。即:

public function upload_file(){
    $this->create_dir();
    $target = $this->backlink_step . $this->target_location .  "/" . $this->get_file_name();
    
    if (move_uploaded_file( $this->get_tmp_name(),  $target )) {
        return $target;
    } else {
        die("tmp_name: {$this->get_tmp_name()} \n target: {$target} \n Error: {$this->File['error']}");
    }
}

我看不到您在哪里定义
$location
。您是否忘记将其复制到示例中,或者它是否未设置?据我所知,您没有为
$this->tmp\u文件名指定值
,因此
上传文件
移动上传文件
阶段出现问题。很抱歉,我忘记复制我声明的
$location
位置的那一行。实际上,我在导入类的那行后面的某个地方声明了它。在复制示例时,我错误地省略了它以及上面的一些评论。非常感谢教授,我真的不敢相信这是我的问题,这给了我一些时间。。。但它确实解决了我的问题。非常感谢您的精彩观察,我刚刚发现属性
tmp\u file\u name
FileUploader
类中从未分配任何值
if (move_uploaded_file( $this->get_tmp_name(),  $target )) {
public function upload_file(){
    $this->create_dir();
    $target = $this->backlink_step . $this->target_location .  "/" . $this->get_file_name();
    
    if (move_uploaded_file( $this->get_tmp_name(),  $target )) {
        return $target;
    } else {
        die("tmp_name: {$this->get_tmp_name()} \n target: {$target} \n Error: {$this->File['error']}");
    }
}