加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Yii2实现UploadedFile上传文件示例

发布时间:2020-12-12 22:00:53 所属栏目:PHP教程 来源:网络整理
导读:闲来无事,整理了一下自己写的文件上传类。 通过 UploadFile::getInstances($model,$attribute); UploadFile::getInstanceByName($name); UploadFile::getInstancesByName($name); 把表单上传的文件赋值到 UploadedFile中的 private static $_files 中 /** R

闲来无事,整理了一下自己写的文件上传类。

通过

UploadFile::getInstances($model,$attribute);

UploadFile::getInstanceByName($name);

UploadFile::getInstancesByName($name);

把表单上传的文件赋值到 UploadedFile中的 private static $_files 中

/**

  • Returns all uploaded files for the given model attribute.
  • @param yiibaseModel $model the data model
  • @param string $attribute the attribute name. The attribute name may contain array indexes
  • for tabular file uploading,e.g. '[1]file'.
  • @return UploadedFile[] array of UploadedFile objects.
  • Empty array is returned if no available file was found for the given attribute.
    */
    public static function getInstances($model,$attribute);
    return static::getInstancesByName($name);
    }

/**

  • Returns an uploaded file according to the given file input name.
  • The name can be a plain string or a string like an array element (e.g. 'Post[imageFile]',or 'Post[0][imageFile]').
  • @param string $name the name of the file input field.
  • @return UploadedFile the instance of the uploaded file.
  • Null is returned if no file is uploaded for the specified name.
    */
    public static function getInstanceByName($name)
    {
    $files = self::loadFiles();
    return isset($files[$name]) ? $files[$name] : null;
    }

/**

  • Returns an array of uploaded files corresponding to the specified file input name.
  • This is mainly used when multiple files were uploaded and saved as 'files[0]','files[1]',* 'files[n]'...,and you can retrieve them all by passing 'files' as the name.
  • @param string $name the name of the array of files
  • @return UploadedFile[] the array of UploadedFile objects. Empty array is returned
  • if no adequate upload was found. Please note that this array will contain
  • all files from all sub-arrays regardless how deeply nested they are.
    */
    public static function getInstancesByName($name)
    {
    $files = self::loadFiles();
    if (isset($files[$name])) {
    return [$files[$name]];
    }
    $results = [];
    foreach ($files as $key => $file) {
    if (strpos($key,"{$name}[") === 0) {
    $results[] = $file;
    }
    }
    return $results;
    }

loadFiles()方法,把$_FILES中的键值作为参数传递到loadFilesRecursive($key,$names,$tempNames,$types,$sizes,$errors) 中

$info) { self::loadFilesRecursive($class,$info['name'],$info['tmp_name'],$info['type'],$info['size'],$info['error']); } } } return self::$_files; }

loadFilesRecursive方法,通过递归把$_FILES中的内容保存到 self::$_files 中

$name) { self::loadFilesRecursive($key . '[' . $i . ']',$name,$tempNames[$i],$types[$i],$sizes[$i],$errors[$i]); } } elseif ($errors !== UPLOAD_ERR_NO_FILE) { self::$_files[$key] = new static([ 'name' => $names,'tempName' => $tempNames,'type' => $types,'size' => $sizes,'error' => $errors,]); } }

实例:

html

php代码,打印的

$patch = $path . '/' . date("YmdHis") . '_'; $tmp = UploadedFile::getInstanceByName('head_pic'); if ($tmp) { $patch = $path . '/' . date("YmdHis") . '_'; $tmp->saveAs($patch . '1.jpg'); $returnPath .= $patch; } return $returnPath;

}

打印dump($tmp,$_FILES,$tmp->getExtension());

对应的 UploadedFile

private static $_files;

/**

  • String output.
  • This is PHP magic method that returns string representation of an object.
  • The implementation here returns the uploaded file's name.
  • @return string the string representation of the object
    */
    public function __toString()
    {
    return $this->name;
    }

/**

  • Returns an uploaded file for the given model attribute.
  • The file should be uploaded using [[yiiwidgetsActiveField::fileInput()]].
  • @param yiibaseModel $model the data model
  • @param string $attribute the attribute name. The attribute name may contain array indexes.
  • For example,or 'Post[0][imageFile]').
  • @param string $name the name of the file input field.
  • @return null|UploadedFile the instance of the uploaded file.
  • Null is returned if no file is uploaded for the specified name.
    */
    public static function getInstanceByName($name)
    {
    $files = self::loadFiles();
    return isset($files[$name]) ? new static($files[$name]) : null;
    }

/**

  • Returns an array of uploaded files corresponding to the specified file input name.
  • This is mainly used when multiple files were uploaded and saved as 'files[0]',and you can retrieve them all by passing 'files' as the name.
  • @param string $name the name of the array of files
  • @return UploadedFile[] the array of UploadedFile objects. Empty array is returned
  • if no adequate upload was found. Please note that this array will contain
  • all files from all sub-arrays regardless how deeply nested they are.
    */
    public static function getInstancesByName($name)
    {
    $files = self::loadFiles();
    if (isset($files[$name])) {
    return [new static($files[$name])];
    }
    $results = [];
    foreach ($files as $key => $file) {
    if (strpos($key,"{$name}[") === 0) {
    $results[] = new static($file);
    }
    }
    return $results;
    }

/**

  • Cleans up the loaded UploadedFile instances.
  • This method is mainly used by test scripts to set up a fixture.
    */
    //清空self::$_files
    public static function reset()
    {
    self::$_files = null;
    }

/**

  • Saves the uploaded file.
  • Note that this method uses php's move_uploaded_file() method. If the target file $file
  • already exists,it will be overwritten.
  • @param string $file the file path used to save the uploaded file
  • @param boolean $deleteTempFile whether to delete the temporary file after saving.
  • If true,you will not be able to save the uploaded file again in the current request.
  • @return boolean true whether the file is saved successfully
  • @see error
    */
    //通过php的move_uploaded_file() 方法保存临时文件为目标文件
    public function saveAs($file,$deleteTempFile = true)
    {
    //$this->error == UPLOAD_ERR_OK UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。
    if ($this->error == UPLOAD_ERR_OK) {
    if ($deleteTempFile) {
    //将上传的文件移动到新位置
    return move_uploaded_file($this->tempName,$file);
    } elseif (is_uploaded_file($this->tempName)) {//判断文件是否是通过 HTTP POST 上传的
    return copy($this->tempName,$file);//copy — 拷贝文件
    }
    }
    return false;
    }

/**

  • @return string original file base name
    */
    //获取上传文件原始名称 "name" => "Chrysanthemum.jpg" "Chrysanthemum"
    public function getBaseName()
    {
    // https://github.com/yiisoft/yii2/issues/11012
    $pathInfo = pathinfo('_' . $this->name,PATHINFO_FILENAME);
    return mb_substr($pathInfo,1,mb_strlen($pathInfo,'8bit'),'8bit');
    }

/**

  • @return string file extension
    */
    //获取上传文件扩展名称 "name" => "Chrysanthemum.jpg" "jpg"
    public function getExtension()
    {
    return strtolower(pathinfo($this->name,PATHINFO_EXTENSION));
    }

/**

  • @return boolean whether there is an error with the uploaded file.
  • Check [[error]] for detailed error code information.
    */
    //上传文件是否出现错误
    public function getHasError()
    {
    return $this->error != UPLOAD_ERR_OK;
    }

/**

  • Creates UploadedFile instances from $_FILE.
  • @return array the UploadedFile instances
    */
    private static function loadFiles()
    {
    if (self::$_files === null) {
    self::$_files = [];
    if (isset($_FILES) && is_array($_FILES)) {
    foreach ($_FILES as $class => $info) {
    self::loadFilesRecursive($class,$info['error']);
    }
    }
    }
    return self::$_files;
    }

/**

  • Creates UploadedFile instances from $_FILE recursively.
  • @param string $key key for identifying uploaded file: class name and sub-array indexes
  • @param mixed $names file names provided by PHP
  • @param mixed $tempNames temporary file names provided by PHP
  • @param mixed $types file types provided by PHP
  • @param mixed $sizes file sizes provided by PHP
  • @param mixed $errors uploading issues provided by PHP
    */
    private static function loadFilesRecursive($key,$errors[$i]);
    }
    } elseif ((int)$errors !== UPLOAD_ERR_NO_FILE) {
    self::$_files[$key] = [
    'name' => $names,];
    }
    }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读