PHPDay0C:日期和时间,文件处理函数,文件上传

目录

0x00 PHP日期和时间

0x01 常用的PHP文件处理函数

0x02 操作文件的函数

0x03 文件的上传

0x04 获取上传图片的信息

​0x05 验证上传图片的格式

0x06 验证文件的大小

0x07 创建上传目录

0x08 移动文件到指定目录

0x09 改造成类的写法


0x00 PHP日期和时间

1.int time(void) 获取当前unix时间戳

unix时间戳是一个10位整数表示距离Unix纪元(1月1日 1970 00:00:00 GMT)的秒数

<?php
echo time();
?>

建议数据库中存时间戳,然后给用户展示的时候,将时间戳转化为正常的时间格式。

2.string date(string format,[,int timestamp])

第一个参数是时间格式,第二个参数为默认时间戳

format 

Y-年份的四位数表示

m-月份的数字表示(从01到12) M 英文的月份表示

d-一个月中的第多少天(01到31)D 英文的星期表示

H-24小时制,带前导零(00到23)

i-分,带前导零(00到59)

s-秒,带前导零 (00到59)

<?php
echo date('Y-m-d H:i:s');
echo date('Y-m-d H:i:s',time())
?>

坑:date默认出来的时间 和 中国的时间差8个小时

需要修改时区为中国时区

(1)脚本内配置:

<?php
    ini_set('date.timezone','Asia/Shanghai');
    //ini_set('date.timezone','PRC');//效果相同
 
    echo date('Y-m-d H:i:s');

?>

(2)php.ini中配置

date.timezone-PRC

重启服务器

3.int strtotime(string time[,int $now = time()])

将表示时间的字符串转化为时间戳。

<?php
    echo strtotime('now');
    echo time();//这两种方式等价
    echo strtotime('+1day');//表示明天这个时候的时间戳。
    echo strtotime('+1week');//表示下周这个时候的时间戳
    echo strtotime('2018-07-08');
?>

4.int mktime(时,分,秒,月,日,年)

生成特定时间的时间戳

<?php
    var_dump(mktime(3,3,3,3,3,2019));
?>

6.mixed microtime()

返回当前时间的微秒级别的数。

可以用来算代码运行的时间。

<?php
    echo microtime();//分开表示
    echo microtime(true);//合起来表示
?>

0x01 常用的PHP文件处理函数

1.string filetype(文件的路径) 取得文件类型

返回值有:

file 文件。txt文件和视屏都是file

dir 文件夹

2.filesize(文件的路径) 获取文件大小(单位为字节B)

3.bool file_exists(文件的路径) 判断一个文件或者文件夹是否存在

4.bool is_dir(文件的路径) 判断一个文件是不是文件夹

5.bool is_file(文件的路径) 判断是不是文件

6.bool unlink(文件的路径) 删除文件,删除成功返回true,删除失败返回false

7.mkdir(路径(包括目录名)) 创建目录

8.rmdir(路径) 删除目录

9.rename(原路径,新路径) 修改文件或者目录的名字

10.basename(路径) 返回路径中的文件名部分。(包括后缀)

<?php
    echo basename('C://test/new.txt') //new.txt
?>

 basename(路径,文件后缀),返回路径中文件名部分(不包括后缀)

11.dirname(路径) 是basename(路径)的补集,返回路径中的目录部分。

12.array pathinfo(路径) 返回值是一个数组,返回绝对路径的各种信息。

string pathinfo('路径',PATHINFO_EXTENSION) 只返回文件扩展名

这个函数有个致命地方,它并不会验证文件是否真的存在。只是从传入的路径中截取信息

例如传入 xxx.txt,这个函数直接字符串截取txt返回了。

下面举例说明

<?php
    echo '<pre/>';
    var_dump(pathinfo('/Applications/MAMP/tmp/php/sess_5tgo5p1u385kme1bcqm7da8d2u'));
    echo '<pre/>';
?>

输出:

array(3) {
  ["dirname"]=>
  string(26) "/Applications/MAMP/tmp/php"
  ["basename"]=>
  string(31) "sess_5tgo5p1u385kme1bcqm7da8d2u"
  ["filename"]=>
  string(31) "sess_5tgo5p1u385kme1bcqm7da8d2u"
}

 

0x02 操作文件的函数

1.resouce fopen(文件路径,打开方式)

  1. r:可读
    1. r只读,
    2. r+读写方式,
  2. w:覆盖写
    1. w只写
    2. w+读写方式
  3. a:追加写
    1. a+读写方式
  4. x:可执行(execute)

 2.int fwrite(resoure $handle,string $string [,int $length]) 写入文件.写入成功返回1,写入失败返回0

3.string fread(resoure $handle,int $length) 读取文件,长度的单位是字节。

4.bool fclose(resoure $handle) 关闭文件。只有在fclose·之后,写入的内容才能保存到文件。

<?php
   $file = fopen('test.txt','a+');
   fwrite($file,"hello world\nxidian university");
   fclose($file);
   $file = fopen("test.txt",'r');
   var_dump(fread($file,filesize("test.txt")));
   fclose($file);
?>

5.file_put_contents(文件路径,要写入的内容) 不需要fopen,直接就能往文件中写。默认覆盖写

如果想要追加写:file_put_contents(文件路径,要写入的内容,FILE_APPEND)

如果有这个文件,打开文件直接写,如果没有这个文件,创建文件直接写。

6. string file_get_contents(文件路径) 不需要fopen,直接读取文件中的内容。

这个函数牛逼的地方在于可以输入url路径。

例如:

file_get_contents('https://www.baidu.com');

0x03 文件的上传

文件上传:图片 视屏 文档

图片上传的步骤:

1.获取上传图片的信息  $_FILES

2.验证上传图片的格式   

3.验证上传图片的大小:因为上传的图片要占用服务器的存储空间。所以如果不限制上传图片的大小。有人上传很大的图片,可能直接占满服务器的硬盘空间。

4.创建上传目录(如果没有)

5.上传文件到指定目录下。

5.上传文件到指定目录下。

0x04 获取上传图片的信息

index.html

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4 <meta charset = 'utf-8'>
  5 <title>文件上传</title>
  6 </head>
  7 <body>
  8 <form action ="upload.php" method = "POST" enctype = "multipart/form-data">
  9 <input type = "file" name = "img"/><br/>
 10 <input type = "submit" name="submit" value = "上传"/><br/>
 11 </form>
 12 </body>
 13 </html>

注意点:

1.enctype = "multipart/form-data" 必须有,否则,upload.php中用$_FILE数组收不到文件信息

2.intput type = 'file'中必须设置 name 。因为$_FILE是一个二维数组。以name的值为第一维的键。

upload.php

<?php
echo '<pre>';
var_dump($_FILES);
echo '</pre>';
?>
array(1) {
  ["img"]=>
  array(5) {
    ["name"]=>
    string(7) "url.png"
    ["type"]=>
    string(9) "image/png"
    ["tmp_name"]=>
    string(36) "/Applications/MAMP/tmp/php/phpd6k2Rm"
    ["error"]=>
    int(0)
    ["size"]=>
    int(14984)
  }
}

$_FILE详解:

假设<input type = 'file' name = 'myFile'/>,则

$_FILES['myFile']['name'] 上传文件的原名称

$_FILES['myFile']['type'] 上传文件的MIME类型,"类型/扩展名"例如:"image/gif" "image/png"”video/mp4“

$_FILES['myFile']['size'] 上传文件的大小,单位为字节

$_FILES['myFile']['tmp_name'] 上传文件的临时文件名(临时文件的绝对路径),一般是系统默认的

$_FILES['myFile']['error'] 该文件上传的错误代码。以下为不同代码的意义:

0:上传文件成功

1:超过了php.ini中upload_max_filesize设置的文件大小

2:超过了php.ini中POST MAX_SIZE中设置的文件大小

3:文件只有部分被上传

4:没有文件被上传

5:上传文件大小为0

如果报错为:413Request Entity Too Large

那么说明是Nginx的配置错误

找到nginx的配置文件:nginx.conf

0x05 验证上传图片的格式

  1 <?php
  2 /*
  3 echo '<pre/>';
  4 var_dump($_FILES);
  5 echo '<pre/>';
  6 */
  7 $fileInfo=$_FILES['img'];
  8 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
  9 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
 10 if(!in_array($ext,$allow_ext)){
 11         exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类型的图片');
    }    
 12 ?>      

0x06 验证文件的大小

  1 <?php
  2 /*
  3 echo '<pre/>';
  4 var_dump($_FILES);
  5 echo '<pre/>';
  6 */
  7 $fileInfo=$_FILES['img'];
  8 //验证文件的扩展名
  9 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
 10 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
 11 if(!in_array($ext,$allow_ext)){
 12         exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类
    型的图片');}
 13 //验证文件的大小
 14 $allow_size = 1024*1024 * 2;//单位字节 2MB
 15 if($fileInfo['size'] > $allow_size){
 16         exit("文件太大,无法上传");
 17 }
 18 
 19 ?>

0x07 创建上传目录

实现效果:所有上传文件都存在uploads文件夹中,哪日上传的文件,存在uploads下以日命名的子文件夹下。

由于windows下和linux下的文件分割符并不相同

win \

linux / 虽然/在window下有时也适用。

所以建议使用 常量DIRECTORY_SEPARATOR来代替分隔符。该常量会根据你的系统来生成分隔符。

  1 <?php
  2 /*
  3 echo '<pre/>';
  4 var_dump($_FILES);
  5 echo '<pre/>';
  6 */
  7 $fileInfo=$_FILES['img'];
  8 //验证文件的扩展名
  9 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
 10 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
 11 if(!in_array($ext,$allow_ext)){
 12         exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类
    型的图片');}
 13 //验证文件的大小
 14 $allow_size = 1024*1024 * 2;//单位字节 2MB
 15 if($fileInfo['size'] > $allow_size){
 16         exit("文件太大,无法上传");
 17 }
 18 //创建上传目录
 19 $dir = 'uploads';
 20 
 21 //$sub_dir = $dir.'/'.date('Y-m-d');
 22 $sub_dir = $dir.DIRECTORY_SEPARATOR.date('Y-m-d');
 23 
 24 if(!is_dir($dir)){
 25         mkdir($dir);
 26 }
 27 if(!is_dir($sub_dir)){
 28         mkdir($sub_dir);
 29 }       
 30 
 31 ?>

0x08 移动文件到指定目录

bool move_uploaded_file(原路径,目的路径)

注意:移动后的图片不要用原来的名字,应该重命名。因为多个人可能上传重名的图片。

一般用日期加上随机数来重命名图片。

  1 <?php
  2 /*
  3 echo '<pre/>';
  4 var_dump($_FILES);
  5 echo '<pre/>';
  6 */
  7 $fileInfo=$_FILES['img'];
  8 if($file['error']!=0){
  9         exit("上传图片有问题");
 10 }
 11 //验证文件的扩展名
 12 $ext = pathInfo($fileInfo['name'],PATHINFO_EXTENSION);
 13 $allow_ext = ['jpg','png','jpeg','gif'];//白名单
 14 if(!in_array($ext,$allow_ext)){
 15         exit('该类型文件不可以上传,请上传jpg/png/jpeg/gif类型的图>    片');}
 16 //验证文件的大小
 17 $allow_size = 1024*1024 * 2;//单位字节 2MB
 18 if($fileInfo['size'] > $allow_size){
 19         exit("文件太大,无法上传");
 20 }
 21 //创建上传目录
 22 $dir = 'uploads';
 23 
 24 //$sub_dir = $dir.'/'.date('Y-m-d');
 25 $sub_dir = $dir.DIRECTORY_SEPARATOR.date('Y-m-d');
 26 
 27 if(!is_dir($dir)){
 28         mkdir($dir);
 29 }
 30 if(!is_dir($sub_dir)){
 31         mkdir($sub_dir);
 32 }
 33 //$img_name = date('YmsHis').rand(1000,9999).'.'.$ext;
 34 $img_name = date('YmsHis').rand(1000,9999).'.'.$ext;
 35 move_uploaded_file($fileInfo['tmp_name'],$sub_dir.DIRECTORY_SEPARA    TOR.$img_name);
 36 
 37 
 38 ?>

0x09 改造成类的写法

<?php
class Upload{
	private $errorNum;//错误码
	private $errorMsg;//错误信息
	private $filename;//文件名
	private $ext;//文件扩展名
	private $allow_ext;//白名单
	private $file_size;
	private $allow_size;
	private $dir;
	private $sub_dir;
	private $new_name;
	private $tmp_path;
	public function __construct($file){
		$this->errorNum = $file['error'];
		$this->filename = $file['name'];
		$this->ext = pathInfo($this->filename,PATHINFO_EXTENSION);
		$this->allow_ext = ['gif','jpg','png','jpeg'];
		$this->file_size = $file['size'];
		$this->allow_size = 2*1024*1024;//2M
		$this->dir = 'uploads';
		$this->sub_dir = 'uploads'.DIRECTORY_SEPARATOR.date('Y-m-d');
		$this->new_name = $this->sub_dir.DIRECTORY_SEPARATOR.date('YmdHis').rand(1000,9999).'.'.$this->ext;
		$this->tmp_path = $file['tmp_name'];
	}
	public function upload(){
		if($this->checkFile() == false){
			return $this->errorMsg;
		}
		$this->createDir();
		$this->move();
		return '上传成功!';
	}
	private function checkFile(){
		if($this->checkError() == false){
			$this->errorMsg = "上传图片有问题";
			return false;
		}
		if($this->checkExt() == false){
			$this->errorMsg = "上传图片的扩展名有问题";
			return false;
		}
		if($this->checkSize()==false){
			$this->errorMsg = "上传图片的大小有问题";
			return false;
		}
		return true;
	}
	//检测上传信息
	private function checkError(){
		return $this->errorNum == 0;
	}
	//检测扩展名
	private function checkExt(){
		return in_array($this->ext,$this->allow_ext);
		
	}
	//检测大小
	private function checkSize(){
		return $this->file_size <= $this->allow_size;
	
	}
	//创建目录
	private function createDir(){
		if(!is_dir('uploads')){
			mkdir('uploads');
		}
		if(!is_dir($this->sub_dir)){
			mkdir($this->sub_dir);
		}
	}
	//移动文件到指定目录
	private function move(){
		move_uploaded_file($this->tmp_path,$this->new_name);
	}
	public function show_picture(){
		echo '<img src = '.$this->new_name.'>';
	}
}
$file = $_FILES['img'];
$upload = new Upload($file);
echo $upload->upload();
$upload->show_picture();
发布了156 篇原创文章 · 获赞 19 · 访问量 8944

猜你喜欢

转载自blog.csdn.net/weixin_43415644/article/details/103994260