微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Yii2实现UploadedFile上传文件示例

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

通过

rush:PHP;"> UploadFile::getInstance($model,$attribute);

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

UploadFile::getInstanceByName($name);

UploadFile::getInstancesByName($name);

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

/**

  • Returns all uploaded files for the given model attribute.
  • @param \yii\base\Model $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

rush:xhtml;">
rftoken() ?>"> display: none" onchange="setimagePreview()"/>

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 [[\yii\widgets\ActiveField::fileinput()]].
  • @param \yii\base\Model $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 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,];
    }
    }
    }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐