我是靠谱客的博主 舒心盼望,最近开发中收集的这篇文章主要介绍PHP基础 —— 文件与目录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在 Windows 中,斜线(/)和反斜线()都可以用作目录分隔符。在其它环境下是斜线(/)。

文件与目录

文件与目录

判断普通文件和目录

is_file( $filename ) : bool —— 判断给定文件名是否为一个普通文件

is_dir ( $filename ) : bool —— 判断给定文件名是都是一个目录,也就是文件夹

我的文件目录 D:PHPStudyphpstudy_proWWWPHPdemo1

.   表示当前目录下的文件
./  表示当前目录下的文件
../ 表示当前文件的目录的父目录文件
/   表示文件的根目录,是当前文件的盘符,也就是 D盘 

<?php
    var_dump( is_file('/msdia80.dll'));//true
    var_dump( is_dir('/PHPstudy'));//
?>
//相对路径
<?php
    var_dump( is_file('../Img/t.jpg'));//true
    var_dump( is_dir('../Img'));//true
?>

文件的属性

1. file_exists( $filename ) : bool —— 检查文件和目录是否存在
<?php
//检查文件和目录是否存在
    var_dump(file_exists("../../index.html"));//false
    var_dump(file_exists("../../index.php"));//true
?>
2. filesize( $filename ) : int —— 获取普通文件的大小,单位为字节
<?php
//获取普通文件的大小,单位为字节
    if(file_exists("7"))
    {
        echo filesize("7")."<br>";//0
        echo filesize("7/7-1.php");//5733 B
    }
    else{
        echo filesize(__FILE__);//计算本文件的大小
    }
?>
3. is_readable( $filename ) : bool—— 判断给定文件名是否可读取
<?php
//判断给定文件名是否可读取
    var_dump(is_readable(__FILE__));//true
?>
4. is_writable( $filename ) : bool —— 判断给定文件名是否可以写入
<?php
//判断给定文件名是否可以写入
    var_dump(is_writable(__FILE__));//true
?>
5. filectime( $filename ) : int —— 获取文件创建时间
<?php
// 获取文件创建时间
    if(file_exists("7"))
    {//创建时间
        echo date("Y-m-d H:i:s",filectime("7"))."<br>";//2020-04-09 21:23:59
        echo date("Y-m-d H:i:s",filectime("7/7-1.php"));//2020-04-09 11:43:11
    }
?>
6. filemtime( $filename ) : int —— 获取文件修改时间
<?php
// 获取文件修改时间
    if(file_exists("7"))
    {
        echo date("Y-m-d H:i:s",filemtime("7"))."<br>";//2020-04-09 21:24:17
        echo date("Y-m-d H:i:s",filemtime("7/7-1.php"));//2020-04-09 22:13:53
    }
?>
7. fileatime( $filename ) : int —— 取得文件上次访问的时间
<?php
//取得文件上次访问的时间
    if(file_exists("7"))
    {//上一次修改时间,即最近一次修改时间
        echo date("Y-m-d H:i:s",fileatime("7"))."<br>";//2020-04-09 21:24:17
        echo date("Y-m-d H:i:s",fileatime("7/7-1.php"));//2020-04-09 22:13:53
    }
?>
8. stat( $filename ) : array —— 获取文件大部分属性值
数字下标关联键名(自 PHP 4.0.6)说明
0devdevice number - 设备名
1inoinode number - inode 号码
2modeinode protection mode - inode 保护模式
3nlinknumber of links - 被连接数目
4uiduserid of owner - 所有者的用户 id
5gidgroupid of owner- 所有者的组 id
6rdevdevice type, if inode device * - 设备类型,如果是 inode 设备的话
7sizesize in bytes - 文件大小的字节数
8atimetime of last access (unix timestamp) - 上次访问时间(Unix 时间戳)
9mtimetime of last modification (unix timestamp) - 上次修改时间(Unix 时间戳)
10ctimetime of last change (unix timestamp) - 上次改变时间(Unix 时间戳)
11blksizeblocksize of filesystem IO * - 文件系统 IO 的块大小
12blocksnumber of blocks allocated - 所占据块的数目
//数组分为两部分,前十三组为数字索引,后十三组为字符串索引,对应的值相等
<?php
//获取文件大部分属性值
    $arr = stat("C:/Windows/System32/drivers/etc/hosts");
    echo count($arr)."<br>";//26
    foreach( $arr as $key => $val)
    {
        echo $key." —— ".$val."<br>";
    }
    // 0    dev —— 2
    // 1    ino —— 0
    // 2    mode —— 33206
    // 3    nlink —— 1
    // 4    uid —— 0
    // 5    gid —— 0
    // 6    rdev —— 2
    // 7    size —— 1064
    // 8    atime —— 1586490940
    // 9    mtime —— 1586490940
    // 10   ctime —— 1536996696
    // 11   blksize —— -1
    // 12   blocks —— -1
?>
9. lstat( $filename ) : array — 给出一个文件或符号连接的信息

lstat() 和 stat() 相同,只除了它会返回符号连接的状态

<?php
//给出一个文件或符号连接的信息
    $arr = lstat("C:/Windows/System32/drivers/etc/hosts");
    echo count($arr)."<br>";//26
    foreach( $arr as $key => $val)
    {
        echo $key." —— ".$val."<br>";
    }
    // 0    dev —— 2
    // 1    ino —— 0
    // 2    mode —— 33206
    // 3    nlink —— 1
    // 4    uid —— 0
    // 5    gid —— 0
    // 6    rdev —— 2
    // 7    size —— 1064
    // 8    atime —— 1586490940
    // 9    mtime —— 1586490940
    // 10   ctime —— 1536996696
    // 11   blksize —— -1
    // 12   blocks —— -1
?>

目录的基本操作

1. basename( $path, [ $suffix ] ) : string—— 返回路径中文件名部分
  • $suffix 可选,若文件名以 $suffix 结尾,就会去掉
<?php
//返回路径中文件名部分
    if(file_exists("7"))
    {
        echo basename("7/7-1.php");//7-1.php
        echo basename("7/7-1.php",".php");//7-1
    }
?>
2. dirname( $path ) : string —— 返回路径中的目录部分
<?php
//返回路径中的目录部分
    echo dirname("7/7-1.php");//7
    echo dirname("C:/Windows/System32/drivers/etc/hosts");//C:/Windows/System32/drivers/etc
    echo dirname(dirname("C:/Windows/System32/drivers/etc/hosts"));//C:/Windows/System32/drivers
?>
3. pathinfo() —— 返回路径的信息

可以看出返回值有四个参数

  • diranme —— 文件的父目录
  • basename —— 文件名
  • extension —— 文件后缀名
  • filename —— 文件名

如果是目录(文件夹),则没有后缀名参数extension

<?php
    print_r(pathinfo("C:/Windows"));//Array ( [dirname] => C: [basename] => Windows [filename] => Windows ) 
    print_r(pathinfo("7/7-1.php"));//Array ( [dirname] => 7 [basename] => 7-1.php [extension] => php [filename] => 7-1 )
    print_r(pathinfo(__FILE__));
    // [dirname] => D:PHPStudyphpstudy_proWWWPHPdemo1 [basename] => 8-2.php [extension] => php [filename] => 8-2 )
?>
4. opendir ( p a t h , [ path ,[ path[context] ) : resource —— 打开目录句柄

可用于之后的 closedir(),readdir() 和 rewinddir() 调用中。

resource 表示 资源
$context —— resource类型
5. readdir ([ $dir_handle ] ) : string —— 从目录句柄中读取条目,返回目录中下一个文件的文件名
$dir_handle —— resource类型
// 一条一条的读取对应目录的文件
// 前两条命令为string(1) "." string(2) ".."
// 当到达最后没有文件的时候,返回false
<?php
    $dir = opendir("../Img");
    var_dump(readdir($dir));//string(1) ".", .表示当前目录
    echo "<br>";
    var_dump(readdir($dir));//string(2) ".." , .. 表示父目录
    echo "<br>";
    var_dump(readdir($dir));//string(11) "Captcha.png"
    echo "<br>";
    var_dump(readdir($dir));//string(19) "Lobster-Regular.ttf"
    echo "<br>";
    var_dump(readdir($dir));//string(11) "segoesc.ttf"
    echo "<br>";
    var_dump(readdir($dir));//string(12) "segoescb.ttf"
    echo "<br>";
    var_dump(readdir($dir));//string(5) "t.jpg"
    echo "<br>";
    var_dump(readdir($dir));//bool(false)
    echo "<br>";
?>
<?php
    $dir = opendir("C:/Windows");
    var_dump(readdir($dir));//string(1) ".", .表示当前目录
    echo "<br>";
    var_dump(readdir($dir));//string(2) ".." , .. 表示父目录
    echo "<br>";
    var_dump(readdir($dir));//string(19) "AceXGame_sys_23.dll"
    echo "<br>";
    var_dump(readdir($dir));//sstring(6) "addins"
    echo "<br>";
?>
6. rewinddir ( $dir_handle ) : void —— 倒回目录句柄
$dir_handle —— resource类型
//使用此函数之后会重新开始读取目录文件
<?php
    $dir = opendir("../Img");
    var_dump(readdir($dir));//string(1) ".", .表示当前目录
    echo "<br>";
    var_dump(readdir($dir));//string(2) ".." , .. 表示父目录
    echo "<br>";
    var_dump(readdir($dir));//string(11) "Captcha.png"
    echo "<br>";
    var_dump(readdir($dir));//string(19) "Lobster-Regular.ttf"
    echo "<br>";

    rewinddir($dir);
    
    var_dump(readdir($dir));//string(1) ".", .表示当前目录
    echo "<br>";
    var_dump(readdir($dir));//string(2) ".." , .. 表示父目录
    echo "<br>";
    var_dump(readdir($dir));//string(11) "Captcha.png"
    echo "<br>";
?>
7. closedir ([ $dir_handle ] ) : void —— 关闭目录句柄
$dir_handle —— resource类型
<?php
    $dir = opendir("../Img");
    var_dump(readdir($dir));//string(1) ".", .表示当前目录
    echo "<br>";
    var_dump(readdir($dir));//string(2) ".." , .. 表示父目录
    echo "<br>";
    var_dump(readdir($dir));//string(11) "Captcha.png"
    echo "<br>";

    closedir($dir);
    
    // var_dump(readdir($dir));//报错
?>
8. mkdir( d i r n a m e ; [ dirname;[ dirname;[mode],[ r e c u r s i v e ] , [ recursive],[ recursive],[content]):bool —— 新建目录
$dirname —— 文件目录
$mode —— 设置文件权限,默认权限0777,可读可写 —— int
$recursive —— 取值true 子目录嵌套也就是创建多层目录,默认false
$content —— resource类型
<?php
    var_dump( mkdir("../demo2")) ;
    var_dump( mkdir("../demo3/first",0777,true)) ;
    var_dump( mkdir("../demo3/second",0777,true)) ;
?>
9. rmdir ( $dirname ,[ $context ] ) : bool —— 删除指定的空目录
$content —— resource类型
<?php
//删除目录下的空目录
    function removeAllFile($parent_file,$true=false){
        // $true 是否删除自身
        if(!is_dir($parent_file))
        {
            return 0;
        }
        $dir = opendir($parent_file);
        $i=0;
        while($str = readdir($dir))
        {
            if ( $i>1 && $str != false) {
                if(rmdir("{$parent_file}"."/"."{$str}")){
                    echo "remove:{$str}"."<br>";
                }
            }
            ++$i;
        }
        if($true)
        {
            rmdir($parent_file);
        }
    }
    removeAllFile("../demo3",true);
?>
10. scandir ( $directory,[ $sorting_order ],[ $context ] ) : array—— 列出指定路径中的文件和目录
$directory —— 浏览的目录
$sorting_order —— 文件的排序,默认排序是按照字母升序排列,若为 1 ,则为降序排列,—— int
 $context  —— 资源类型

用这个删除文件就方便了多了

<?php
    for ($i=1; $i < 5; $i++) { 
        var_dump( mkdir("../demo4/adio_{$i}",0777,true)) ;
    }
    print_r(scandir("../demo4"));
    //Array ( [0] => . [1] => .. [2] => adio_1 [3] => adio_2 [4] => adio_3 [5] => adio_4 )
?>

文件的基本操作

1. fopen() —— 打开文件或者 URL

fopen()

fopen (  $filename ,  $mode ,[$use_include_path = false], [ $context ]] ) : resource
$filename —— 目录
$mode —— 访问类型
$use_include_path —— 如果也需要在 include_path 中搜寻文件的话,可以将可选的第三个参数 use_include_path 设为 '1' 或 TRUE。
$context —— 资源resource类型
mode说明
‘r’只读方式打开,将文件指针指向文件头。
‘r+’读写方式打开,将文件指针指向文件头。
‘w’写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘x’创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL
‘x+’创建并以读写方式打开,其他的行为和 ‘x’ 一样。
2. fread() —— 读取文件
fread (  $handle ,  $length ) : string
$handle  —— 打开的资源resource类型文件,——resource
$length —— 要读取length长度个字符
<?php
    $file = fopen("../Img/index.txt","r");
    echo(fread($file,1024));//1111 222 33 466565
    //返回值为读取的字符串
?>
3. fgets() —— 从文件指针中读取一行
fgets (  $handle,[ $length ] ) : string
$handle  —— 打开的资源resource类型文件,——resource
$length —— 每一行读取 $length - 1 个字符,然后多余的会调到下一行
<?php
    $file = fopen("../Img/index.txt","r");
    echo fgets($file,10);
?>
<?php
//文件内容
// 1111
// 222
// 33
// 4
    $file = fopen("../Img/index.txt","r");
    echo fgets($file);
    echo "<br>";
    echo fgets($file,3);
    echo "<br>";
    echo fgets($file);
    echo "<br>";
    echo fgets($file);
    // 1111
    // 22
    // 2
    // 33    
?>
4. feof() —— 测试文件指针是否到了文件结束的位置
feof ($handle ) : bool
$handle  —— 打开的资源resource类型文件,——resource
<?php
    $file = fopen("../Img/index.txt","r");
    echo(fread($file,4));//1111
    var_dump(feof($file));//false
    
    echo(fread($file,1024));//222 33 466565
    var_dump(feof($file));//true
?>
5. fwrite() —— 写入文件(可安全用于二进制文件)
fwrite (  $handle ,  $string, [int $length ] ) : int
$handle  —— 打开的资源resource类型文件,——resource
$string —— 要写入的字符串
$length —— 写入length长度的字符,超过此长度就不会写入了

返回值: —— 字符串长度
<?php
    $file = fopen("../Img/index.txt","a");
    echo(fwrite($file,"66565"));//返回字符串长度——5
?>
6. rewind() —— 倒回文件指针的位置
rewind ( resource $handle ) : bool

将 handle 的文件位置指针设为文件流的开头。
<?php
    $file = fopen("../Img/index.txt","r");
    echo(fread($file,4));//1111
    var_dump(feof($file));//false
    rewind($file);
    echo(fread($file,1024));//1111 222 33 466565
?>
7. flock() —— 轻便的咨询文件锁定

设置锁定,防止多人同时修改,造成堵塞

flock ( $handle , $operation , [&$wouldblock] ) : bool
$handle  —— 打开的资源resource类型文件,——resource
operation —— 取值:
        LOCK_SH取得共享锁定(读取的程序)。
        LOCK_EX 取得独占锁定(写入的程序。
        LOCK_UN 释放锁定(无论共享或独占)。
&$wouldblock —— Windows 上不支持

当修改完成,记得解锁,还是使用函数,修改第二个参数

8. fclose() —— 关闭一个已打开的文件指针
fclose ( $handle ) : bool
<?php
    $file = fopen("../Img/index.txt","r");
    echo(fread($file,4));//1111
    fclose($file);
    echo(fread($file,1024));//报错,因为文件已经关闭
?>
9. fseek() — 在文件指针中定位
fseek ( $handle , $offset, [ $whence = SEEK_SET ] ) : int
$offset —— 偏移量。
$whence —— 取值:
        SEEK_SET - 设定位置等于 offset 字节。
        SEEK_CUR - 设定位置为当前位置加上 offset。
        SEEK_END - 设定位置为文件尾加上 offset。
<?php
    $file = fopen("../Img/index.txt","r");
    fseek($file,1);
    echo(fread($file,3));//111,此时光标在第一行结尾
    fseek($file,2,SEEK_CUR);//因为存在换行符,rn两个字符
    echo(fread($file,3));//222
?>
10. file() —— 把整个文件读入一个数组中
file ( $filename ,[$flags = 0], [ $context ] ) : array

$filename —— 文件的路径。
$flags: 取值: 
    FILE_USE_INCLUDE_PATH —— 在 include_path 中查找文件。
    FILE_IGNORE_NEW_LINES——在数组每个元素的末尾不要添加换行符
    FILE_SKIP_EMPTY_LINES——跳过空行
$context —— 资源resource类型
//测试感觉flags的参数没什么用
<?php
//修改了index,添加了一空行
    print_r(file("../Img/index.txt"));//Array ( [0] => 1111 [1] => [2] => 222 [3] => 33 [4] => 466565 )
    echo "<br>";
    print_R(file("../Img/index.txt",FILE_USE_INCLUDE_PATH));//Array ( [0] => 1111 [1] => [2] => 222 [3] => 33 [4] => 466565 )
    echo "<br>";
    print_r(file("../Img/index.txt",FILE_IGNORE_NEW_LINES));//Array ( [0] => 1111 [1] => [2] => 222 [3] => 33 [4] => 466565 )
    echo "<br>";
    print_r(file("../Img/index.txt",FILE_SKIP_EMPTY_LINES));//Array ( [0] => 1111 [1] => [2] => 222 [3] => 33 [4] => 466565 )
?>
11. copy() —— 拷贝文件
copy (  $source ,  $dest ,[ $context ] ) : bool

$source —— 源文件
$dest —— 目标路径,如果目标文件已存在,将会被覆盖
$context —— 资源resource类型
<?php
    var_dump(copy("../Img/index.txt","../Img/this.txt"));//true
?>
12. unlink() —— 删除文件
unlink ( $filename , [ $context ] ) : bool
$filename —— 文件的路径。
$context —— 资源resource类型
<?php
    var_dump(unlink("../Img/this.txt"));//true
?>
13. file_get_contents() —— 将整个文件读入一个字符串
file_get_contents (  $filename ,[ $use_include_path = false], [ $context], [ $offset = -1], [$maxlen ] ) : string

$filename —— 文件的路径。
use_include_path —— 从PHP 5开始,FILE_USE_INCLUDE_PATH可用于触发包含路径include path搜索。
$context —— 资源resource类型,可以用 NULL 来忽略。
$offset —— 从原始流开始读取的偏移量。
$maxlen  —— 读取的最大数据长度。默认设置为读取直到到达文件末尾。
<?php
    echo(file_get_contents("../Img/that.txt",false,NULL));//1111 222 33 466565
    echo(file_get_contents("../Img/that.txt",false,NULL,4,5));//222,注意换行由两个字符组成,rn
?>
14. file_put_contents() —— 将字符串写入文件中
file_put_contents (  $filename , $data ,[ $flags = 0], [ $context ] ) : int

$filename —— 文件的路径
$data —— 要写入的数据
flags
    flags 的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。
        FILE_USE_INCLUDE_PATH	在 include 目录里搜索 $filename。 
        FILE_APPEND	如果文件 $filename 已经存在,追加数据而不是覆盖。
        LOCK_EX	在写入时获得一个独占锁。
//返回值为字符串的长度
<?php
    $str = "MyNameIsYz";
    echo(file_put_contents("../Img/this.txt",$str,FILE_APPEND));//10
?>
15. rename() —— 重命名一个文件或目录
rename ( $oldname , $newname [ $context ] ) : bool
<?php
    var_dump(rename("../Img/that.txt","../Img/this.txt"));//true
    var_dump(rename("../Img/this.txt","../Img/that.txt"));//true
?>
16. readfile() —— 读入一个文件,并写入到输出缓冲
readfile ( $filename, [ $use_include_path = false], [ $context ] ) : int

filename —— 要读取的文件名。
use_include_path
        想要在 include_path 中搜索文件,可使用这个可选的第二个参数,设为 TRUE。
<?php
    $file = fopen("../Img/index.txt","a");
    readfile("../Img/index.txt");//1111 222 33 466565
?>
17. ftruncate() — 将文件截断到给定的长度
ftruncate (  $handle , $size ) : bool

$handle —— 文件指针。
$size —— 截断到的大小。
            如果 $size 大于文件,则文件将扩展为空字节。

//文件内容会为$size大小
<?php
    $file = fopen("../Img/index.txt","a");
    ftruncate($file,5);//1111
?>
18. ftell — 返回文件指针读/写的位置
ftell ( resource $handle ) : int
//请注意Window中的换行——rn
<?php
    $file = fopen("../Img/index.txt","r");
    echo fread($file,6);//1111
    echo ftell($file);//6
    echo fread($file,5);//222
?>
19. fflush() — 将缓冲内容输出到文件
fflush ( resource $handle ) : bool

文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。

<?php
    $file = fopen("../Img/index.txt","a");
    fwrite($file, 'MyNameIsYz');
    var_dump(fflush($file));
    ftruncate($file, ftell($file));
    fclose($file);
?>

缓存机制:

当进行文件操作,修改内容,之前的内容会计入缓存机制,然后当调用时就会使用

文件的上传

上传文件的过程不需要管理,是自动的,上传的文件会存放到临时目录中,实际操作就是将该目录中的文件转移到我们需要的地方

HTML标签上传设置

form标签设置

(1) method 设置为 post

(2) enctype 设置为 multipart/form-data

(3) form表单中设置隐藏类型的input,其中name设置为MAX_FILE_SIZE,value值设置为需要限制的上传文件的大小(单位:字节)

    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" id="myfile">
        <input type="submit" name="submit" value="开始上传" id="submitFile">
    </form>
//注意 name 会在后期的上传中使用
//$_POST['submit'] 此处是用来 sumbit
//$_FILES["myfile"]["name"] 此处的 myfile
配置文件

php.ini 配置文件

php.ini 配置 :https://www.php.net/manual/zh/ini.php

集成环境直接搜索文件,然后进行操作

  1. PHPstudy 应该是在 phpstudy_proExtensionsphp 目录下
  2. Wampserver 应该在 此软件目录 Apachebin 下
配置项默认值描述
file_uploadsON确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit8M设置脚本可以分配的最大内存量,防止失控的脚本独占服务武器
upload_max_filesize2M限制PHP处理上传文件的最大值,此值必须小于post_max_size
post_max_size8M限制通过POST方法可以接受的信息需大量
upload_tmp_dirNULL上传文件存放的临时路径,可以是绝对路径,此目录对于拥有此服务器进程的用户必须是可写的,如果未指定,PHP将使用系统的默认值。

根据各人需要进行修改:

注意:
post_max_size 要大于 upload_max_filesize

我的设置:

有些默认值感觉也可以,不要改的

file_uploads = On
memory_limit=256M
upload_max_filesize=100M
post_max_size=200M
upload_tmp_dir = ""
$_FILES 多维数组

用于存储各种与上传文件有关的信息

描述
$_FILES[ ‘file’ ][ ‘name’ ]客户端机器文件的原名称,包含扩展名
$_FILES[ ‘file’ ][ ‘size’ ]已上传文件的大小,单位字节
$_FILES[ ‘file’ ][ ‘tmp_name’ ]文件上传之后,在服务器端存储的临时文件名
$_FILES[ ‘file’ ][ ‘error’ ]文件上传时产生的错误,0 —— 表示没有发生任何错误,上传成功 。1 —— 表示长传的文件大小超出了在PHP配置文件中upload_max_filesize 选项限制的值 。 2 —— 表示上传文件大小超出HTMl表单找那个 MAX_FILE_SIZE 选项所指定的值
$_FILES[ ‘file’ ][ ‘type’ ]获取客户端上传文件的MIME类型

MIME类型 规定了各种文件格式的类型,每种MIME类型都是由 " / " 分隔 的主类型 和 子类型组成

当文件上传成功之后,不会显示在upload_tmp_dir设置的 目录里,因为上传的文件被销毁,该文件是临时文件,当刚上传的时候,可以看到闪一下就没了

函数处理
  1. is_uploaded_file() —— 判断 指定的文件是否通过HTTP POST 上传
is_uploaded_file ( string $filename ):布尔
filename —— 正在检查文件名。

函数is_uploaded_file()需要一个$ _FILES ['file'] ['tmp_name']之类的参数 

客户端计算机$ _FILES ['file'] ['name']上载文件的名称不行。
  1. move_uploaded_file() —— 文件上传后,首先会存储于服务器的临时目录中,使用此函数将文件移动到新位置
move_uploaded_file ( string $filename , string $destination ):布尔

filename —— 上传文件的文件名。

destination —— 移动文件的目的地。

例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
</head>
<body>
    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" id="myfile">
        <input type="submit" name="submit" value="开始上传" id="submitFile">
    </form>
</body>
</html>
<?php
    header("Content-type:text/html;charset=utf-8;");
    if(isset($_POST['submit'])){//判断是否上传文件
        if(  is_uploaded_file($_FILES["myfile"]["tmp_name"]) )//判断文件是否是通过HTTP POST上传
        {
            $file = pathinfo($_FILES["myfile"]["name"]);//保存文件信息
            $str_ext = $file["extension"];//获取文件扩展
            $new_file = date("YmdHis");
            $str_file = $new_file.".".$str_ext;//拼接新的文件名
            if(move_uploaded_file($_FILES["myfile"]["tmp_name"],"D:PHPStudyphpstudy_proNewFile\{$str_file}"))
            //保存上传的文件,此处要注意  —— 存在转义问题,会造成一些问题
            {
                echo "上传成功";
            }
            else
            {
                echo "上传失败";
            }
        }
        else
        {
            exit("可能有攻击,停止上传");
        }
    }
    else{
        echo "上传失败";
    }
?>

文件的下载

浏览器无法打开,就会产生下载

发送指定的文件MIME类型的头文件

header("Content-type: MIME 类型");
File Information 扩展

获取文件MIME类型, PHP 扩展,PHP版本低,可能需要下载

finfo_open() —— 创建一个 fileinfo 资源
finfo_open ([ int $options= FILEINFO_NONE ],[ string $magic_file=“” ]):resource

options —— 一个 Fileinfo 常量 或多个 Fileinfo 常量 进行逻辑或运算。

magic_file —— 魔数数据库文件名称, 通常是 /path/to/magic.mime。 如果未指定,则使用 MAGIC 环境变量。 如果未指定此环境变量, 则使用 PHP 绑定的魔数数据库。
                传入 NULL 或者空字符串,等同于使用默认值。

一个 Fileinfo 常量 : https://www.php.net/manual/zh/fileinfo.constants.php

$file_finfo = finfo_open(FILEINFO_MIME_TYPE);//返回文件的 mime 编码
finfo_file() —— 返回一个文件的信息
finfo_file ( resource $finfo , string $file_name = NULL ,[ int $options = FILEINFO_NONE ], [ resource $context = NULL ] ) : string

$finfo —— finfo_open() 函数所返回的 fileinfo 资源。
file_name —— 要检查的文件名。
options —— 一个 Fileinfo 常量 或多个 Fileinfo 常量 进行逻辑或运算。
$context —— 资源resource类型

返回 file_name 参数指定的文件信息。 发生错误时返回 FALSE 。
    $file = "D:PHPStudyphpstudy_proNewFiledownload太阳能作业.zip";
    $file_finfo = finfo_open();
    var_dump(finfo_file($file_finfo,$file,FILEINFO_MIME_TYPE));//string(15) "application/zip"
//返回zip文件的MIME编码
finfo_close() — 关闭 fileinfo 资源
finfo_close ( resource $finfo ) : bool
   finfo_close($file_finfo);
finfo_buffer() —— 返回一个字符串缓冲区的信息
finfo_buffer ( resource $finfo , string $string = NULL [int $options = FILEINFO_NONE], [ resource $context = NULL ] ) : string

$finfo —— finfo_open() 函数所返回的 fileinfo 资源。
$string —— 要检查的文件内容。
options —— 一个 Fileinfo 常量 或多个 Fileinfo 常量 进行逻辑或运算。
$context —— 资源resource类型

返回 string 参数所指定内容的类型描述。 发生错误时返回 FALSE 。
    var_dump(finfo_buffer($file_finfo,$file,FILEINFO_MIME_TYPE));//string(10) "text/plain"

指定下载文件的描述

header("Content-Disposition:attachment;filename=文件名称")

指定下载文件的大小

header("Content-length:文件大小");

读取文件内容至输出缓冲区

readfile();

例子

<?php
//在读取文件之前进行伪装模拟,然后显示到浏览器,供用户下载
    function download($file = NULL){
        if($file == NULL){
            $file = "D:PHPStudyphpstudy_proNewFiledownload太阳能作业.zip";
        }
        $arr = pathinfo($file);//获取文件信息
        $file_finfo = finfo_open();//打开finfo文件
        $FileMIME = finfo_file($file_finfo,$file,FILEINFO_MIME_TYPE);//获取文件类型对应的MIME信息
        header("Content-type:{$FileMIME}");
        finfo_close($file_finfo);//关闭finfo文件
        $file_name = $arr["basename"];
        header("COntent-Disposition:attachement;filename=".$file_name);//备注文件信息
        header("Content-Length:".filesize($file));//指定文件大小
        readfile($file);//输出文件
        return readfile($file);
    }
    download();
?>

最后

以上就是舒心盼望为你收集整理的PHP基础 —— 文件与目录的全部内容,希望文章能够帮你解决PHP基础 —— 文件与目录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部