温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在Yii2中使用UploadedFile对文件进行上传

发布时间:2021-01-28 11:34:41 来源:亿速云 阅读:281 作者:Leah 栏目:开发技术

本篇文章给大家分享的是有关如何在Yii2中使用UploadedFile对文件进行上传,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

UploadFile::getInstance($model, $attribute); UploadFile::getInstances($model, $attribute); UploadFile::getInstanceByName($name); UploadFile::getInstancesByName($name);

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

/**    * 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, '[1]file' for tabular file uploading; and 'file[1]' for an element in a file array.    * @return UploadedFile the instance of the uploaded file.    * Null is returned if no file is uploaded for the specified model attribute.    * @see getInstanceByName()    */   public static function getInstance($model, $attribute)   {     $name = Html::getInputName($model, $attribute);     return static::getInstanceByName($name);   }   /**    * 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)   {     $name = Html::getInputName($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) 中

/**    * 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['name'], $info['tmp_name'], $info['type'], $info['size'], $info['error']);         }       }     }     return self::$_files;   }

loadFilesRecursive方法,通过递归把$_FILES中的内容保存到  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, $names, $tempNames, $types, $sizes, $errors)   {     if (is_array($names)) {       foreach ($names as $i => $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

<form class="form-horizontal form-margin50" action="<?= \yii\helpers\Url::toRoute('upload-face') ?>"           method="post" enctype="multipart/form-data" id="form1">          <input type="hidden" name="_csrf" value="<?= Yii::$app->request->getCsrfToken() ?>">          <input type="file" name="head_pic" id="doc"  onchange="setImagePreview()"/>  </form>

php代码,打印的

public static function uploadImage($userId = '', $tem = '')   {     $returnPath = '';     $path = 'uploads/headpic/' . $userId;     if (!file_exists($path)) {       mkdir($path, 0777);       chmod($path, 0777);     }     $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());

如何在Yii2中使用UploadedFile对文件进行上传

对应的 UploadedFile

class UploadedFile extends Object {   /**    * @var string the original name of the file being uploaded    */   // "Chrysanthemum.jpg"   public $name;   /**    * @var string the path of the uploaded file on the server.    * Note, this is a temporary file which will be automatically deleted by PHP    * after the current request is processed.    */   // "C:\Windows\Temp\php8CEF.tmp"   public $tempName;   /**    * @var string the MIME-type of the uploaded file (such as "image/gif").    * Since this MIME type is not checked on the server-side, do not take this value for granted.    * Instead, use [[\yii\helpers\FileHelper::getMimeType()]] to determine the exact MIME type.    */   // "image/jpeg"   public $type;   /**    * @var integer the actual size of the uploaded file in bytes    */   // 879394   public $size;   /**    * @var integer an error code describing the status of this file uploading.    * @see http://www.php.net/manual/en/features.file-upload.errors.php    */   // 0   public $error;   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, '[1]file' for tabular file uploading; and 'file[1]' for an element in a file array.    * @return UploadedFile the instance of the uploaded file.    * Null is returned if no file is uploaded for the specified model attribute.    * @see getInstanceByName()    */   public static function getInstance($model, $attribute)   {     $name = Html::getInputName($model, $attribute);     return static::getInstanceByName($name);   }   /**    * 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)   {     $name = Html::getInputName($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 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]', '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 [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['name'], $info['tmp_name'], $info['type'], $info['size'], $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, $names, $tempNames, $types, $sizes, $errors)   {     if (is_array($names)) {       foreach ($names as $i => $name) {         self::loadFilesRecursive($key . '[' . $i . ']', $name, $tempNames[$i], $types[$i], $sizes[$i], $errors[$i]);       }     } elseif ((int)$errors !== UPLOAD_ERR_NO_FILE) {       self::$_files[$key] = [         'name' => $names,         'tempName' => $tempNames,         'type' => $types,         'size' => $sizes,         'error' => $errors,       ];     }   } }

以上就是如何在Yii2中使用UploadedFile对文件进行上传,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI