回复
php 文件操作 原创
深处莫神
发布于 2022-8-25 09:26
浏览
0收藏
@toc
文件操作
获取文件数据
1.首先一点,我们是在所写文件的父亲目录下进行的操作。
2.获取文件路径,需要注意文件路径需要变成/才能 $path = str_replace("\\", "/", dirname(__FILE__));
文件和文件夹的区分
3.获得文件路径之后,获得的路径目录下是包含有文件和文件夹两种类型的,需要对文件和文件夹进行不同的区别,文件需要获取文件类型为本身的后缀例如:txt,同时二者的操作也是对应不同的,要根据类型的不同进行填写。
//准备数组分别存放
$dirs = [];
$files = [];
//读取文件夹的方法,scandir() 函数返回指定目录中的文件和目录的数组。
$list = scandir($path);
//循环遍历
foreach($list as $item)
{
//.当前文件夹和..上一级文件夹 是系统自带的,需要跳过
if($item == "." || $item == "..")
{
continue;
}
//组装子文件夹的路径,拼接
$current = $path.'/'.$item;
//判断是什么类型的文件
if(is_dir($current))
{
//是文件夹
$dirs[] = [
'name'=>$item, //文件名
'type'=> '文件夹', //类型
'size'=>FileTotal(filesize($current)), //算大小
'time'=>date('Y-m-d H:i', filectime($current)) //创建时间
];
}
if(is_file($current))
{
//是文件
$files[] = [
'name'=>$item, //文件名
'type'=>pathinfo($item, PATHINFO_EXTENSION), //文件类型的后缀
'size'=>FileTotal(filesize($current)), //大小
'time'=>date("Y-m-d H:i", filectime($current)), //时间
];
}
}
数据填入表格
4.获取到数据之后,将获取的信息填入到表格之中,此时会用到 高级分离术(需要在html或其他地方使用php语法时候需要进行嵌套)—即就是将循环分成两半
知识点 |
---|
pathinfo(path, options)函数~~例如(/documents/gfg.txt)~~会根据options不同返回目录名( /documents),基本名( gfg.txt),扩展名(txt) |
//文件
<?php foreach($files as $item){?>
<tr>
<td><?php echo $item['name'];?></td>
<td><?php echo $item['type'];?></td>
<td><?php echo $item['size'];?></td>
<td><?php echo $item['time'];?></td>
<td>
<a href="info.php?path=<?php echo $path; ?> &filename=<?php echo $item['name'];?>">编辑</a>
<a data-old="<?php echo $path.'/'.$item['name']?>" onclick="EditFile(this)" href="#">重命名</a>
<a data-file="<?php echo $path.'/'.$item['name']?>" onclick="DelFile(this)" href="#">删除</a>
</td>
</tr>
<?php }?>
//文件夹
<?php foreach($dirs as $item){?>
<tr>
<td>
<a href="index.php?path=<?php echo $path.'/'.$item['name'];?>">
<?php echo $item['name'];?>
</a>
</td>
<td><?php echo $item['type'];?></td>
<td><?php echo $item['size'];?></td>
<td><?php echo $item['time'];?></td>
<td>
<a href="javascript:void(0)">重命名</a>
<a href="javascript:void(0)">删除</a>
<a href="javascript:void(0)">强制删除</a>
</td>
</tr>
<?php
}?>
字节大小转换
5.获取字节大小需要往上搜素相关转换函数,把其转换为以KB,GB,MB,字节为单位的文件大小
//转换字节大小单位
// $filesize 文件大小
function FileTotal($filesize = 0)
{
if ($filesize >= 1073741824) {
$filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
} elseif ($filesize >= 1048576) {
$filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
} elseif ($filesize >= 1024) {
$filesize = round($filesize / 1024 * 100) / 100 . ' KB';
} else {
$filesize = $filesize . ' 字节';
}
return $filesize;
}
字节计算
文件夹字的总和应该等于文件夹里包含的所有文件的文件字节之和。主要是用队列存储第一级的文件(大队列),然后从第一级文件的第一个文件开始扫描里面所包含的文件,如果是文件夹,入队小队列,是文件计算字节,双重循环即可计算。
function dirsize($dir) {
if (!is_dir($dir)) {
return filesize($dir);
}
// 统计文件夹内所有文件大小之和
$total_size = 0;
// 用队列存储文件夹路径(按照广度优先搜素进行遍历)
$dir_queue = [$dir];
for ($front=0; $front < sizeof($dir_queue); $front++) {
// 取队列头元素
$path = $dir_queue[$front];
// var_dump($path);
// 扫描文件
$list = scandir($path);
foreach($list as $item)
{
if($item == "." || $item == "..")
{
continue;
}
//组装子文件夹的路径
$current = $path.'/'.$item;
//判断是文件夹就入队
if(is_dir($current))
{
//是文件夹
$dir_queue[] = $current;
}
// 是文件就计算大小
if(is_file($current))
{
//是文件
$total_size += filesize($current);
}
}
}
return $total_size;
}
文件新建操作
6.文件操作–新建文件,点击按钮触发新建文件事件,文件名称为空则创建失败,\s匹配空白字符,文件名字不允许出现空白格。
<a id="AddFile" href="#">创建文件</a>
<script>
//获取元素
var AddFile = document.getElementById('AddFile')
//绑定事件
AddFile.onclick = function () {
//输入框
var filename = prompt('请输入创建的文件名称')
if (filename == null) {
return false
}
//js替换 null
filename = filename.replace(/\s/g, "")
//内容为空
if (filename) {
//将输入的文件名称传递给php
//地址跳转传参
// action作用是我自己自定义的用来区分用户是做什么操作
location.href = `index.php?path=${path}&filename=${filename}&action=addfile`
return false
} else {
alert('文件名称不能为空')
return false
}
}
</script>
7.action跳转行为 action=addfile
知识点 |
---|
file_put_contents() 函数把一个字符串写入文件中。 |
//创建文件
if($action == "addfile")
{
//index.php?path=/Applications/MAMP/htdocs/class/php/filesystem/demo/hello & filename=index.txt & action=addfile
$filename = isset($_GET['filename']) ? trim($_GET['filename']) : '';
if(empty($filename))
{
ShowMsg('新的文件名称不能为空');
exit;
}
$filename = $path.'/'.$filename;
//如果这个文件存在就不能重复创建
if(is_file($filename))
{
ShowMsg('文件已存在');
exit;
}
//创建文件 返回写入的长度
$result = file_put_contents($filename, " ");
if($result)
{
ShowMsg('创建文件成功', "index.php?path=$path");
exit;
}else
{
ShowMsg('创建文件失败');
exit;
}
}
新建文件夹操作
7.文件操作–新建文件夹,与新建文件基本相同
知识点 |
---|
mkdir() 函数创建目录。 |
<a id="AddDir" href="#">创建文件夹</a>
var AddDir = document.getElementById('AddDir')
//绑定事件
AddDir.onclick = function()
{
//输入框
var dirname = prompt('请输入创建的文件夹的名称')
if(dirname == null)
{
return false
}
//js替换 null
dirname = dirname.replace(/\s/g, "")
//内容为空
if(dirname)
{
//将输入的文件名称传递给php
//跳转传参
// action作用是我自己自定义的用来区分用户是做什么操作
location.href = `index.php?path=${path}&dirname=${dirname}&action=adddir`
return false
}else
{
alert('文件夹名称不能为空')
return false
}
}
7.action跳转行为 action=adddir
// 创建文件夹
if($action == "adddir")
{
//index.php?path=/Applications/MAMP/htdocs/class/php/filesystem/demo/hello & filename=index.txt & action=addfile
$dirname = isset($_GET['dirname']) ? trim($_GET['dirname']) : '';
if(empty($dirname))
{
ShowMsg('新的文件夹名称不能为空');
exit;
}
$dirname = $path.'/'.$dirname;
// echo $dirs['type']='文件夹';
// var_dump($dirname);
// exit;
// 设置创建的文件类型为文件夹
//如果这个文件存在就不能重复创建
if(is_dir($dirname))
{
ShowMsg('文件夹已存在');
exit;
}
//创建文件夹 返回写入的长度
$result = mkdir($dirname);
if($result)
{
ShowMsg('创建文件夹成功', "index.php?path=$path");
exit;
}else
{
ShowMsg('创建文件夹失败');
exit;
}
}
文件删除操作
8.删除文件
<a data-file="<?php echo $path.'/'.$item['name']?>" onclick="DelFile(this)" href="#">删除</a>
//删除文件
// data-file js自定义属性
function DelFile(that)
{
//获取this元素自身的自定义属性 data-file
var filename = that.dataset.file
//弹框
if(confirm('是否确认删除文件'))
{
//真删除
//跳转传参
location.href = `index.php?path=${path}&filename=${filename}&action=delfile`
return false
}
}
删除文件 action=delfile
知识点 |
---|
unlink() 函数删除文件。 |
@ 即就是error control operator,预制符,抑制警告等非致命错误 |
//删除文件
if($action == "delfile")
{
//接收要删除的文件名称
$filename = isset($_GET['filename']) ? trim($_GET['filename']) : '';
//判断变量是否为空
if(empty($filename))
{
ShowMsg('删除的文件名称为空');
exit;
}
//判断文件是否存在
if(!is_file($filename))
{
ShowMsg('要删除的文件不存在');
exit;
}
//删除文件 删除成功返回true 否则false
$result = @unlink($filename);
if($result)
{
ShowMsg('文件删除成功', "index.php?path=$path");
exit;
}else
{
ShowMsg('文件删除失败');
exit;
}
}
文件重命名
column1 |
---|
prompt(msg,defaultText)------ msg:要在对话框显示的文本 defaultText:默认输入的文本 |
substr(string,start<,length>)-----从string 的start位置开始提取字符串 |
<a data-old="<?php echo $path.'/'.$item['name']?>" onclick="EditFile(this)" href="#">重命名</a>
//重命名文件
function EditFile(that)
{
//获取自定义参数
//旧的文件名
var old = that.dataset.old;
//输入一个新的文件名
var filename = prompt('请输入新的文件名称', old.substr(path.length).replace('/', ''));
//点击了取消
if(filename == null)
{
return false
}
//js替换 null
filename = filename.replace(/\s/g, "")
if(filename)
{
//传参跳转
location.href = `index.php?path=${path}&old=${old}&filename=${filename}&action=editfile`
return false
}else
{
//为空
alert('请输入新的文件名称')
return false
}
}
文件上传—首先文件上传后需要提交,提交则只有放在表单中才可进行提交操作
<form>
<input type="file" name="file" />
<button type="submit">提交文件</button>
</form>
>$_FILES接受文件的超全局变量 ,可以获取通过POST方式上传到服务器的所有文件数据。
// 接受文件的超全局变量
if($_FILES)
{
// 调用封装方法
$result = upload('file', $path);
// 文件是否上传成功
if($result){
ShowMsg('文件上传成功', "index.php?path=$path");
exit;
}
else{
ShowMsg('文件上传失败');
exit;
}
}
上传文件不能为空,为空的文件被上传是没有任何意义的。通过var_dump($_FILES;)可以查看到文件数组所含有的数组信息,然后分别对数组信息进行相对应情况的判断。
// 文件上传的封装
// $name 表单域中的input file name 属性
function upload($name='file',$path ='',$size=100000,$type=['jpg','jpeg','png','gif'])
{
// $file = $_FILES;
// var_dump($file);
// exit;
// 获取要上传文件
$file = isset($_FILES[$name]) ? $_FILES[$name] : [];
// // 判断内容是否为空
if(empty($file)){
ShowMsg('上传文件为空');
return false;
}
// 判断文件是否有上传错误
$error=isset($file['error']) ? $file['error'] : 0;
if($error > 0){
switch($error){
case 1:
ShowMsg('超出了php.ini配置文件的限制大小');
break;
case 2:
ShowMsg('超出了表单所限制的大小');
break;
case 3:
ShowMsg('网络中断');
break;
case 4:
ShowMsg('无文件上传');
break;
default:
ShowMsg('未知错误');
}
}
// 判断文件大小是否超过限制
if($file['size'] > $size){
ShowMsg('文件大小超过系统配置');
exit;
}
//判断这个类型在不在数组里面
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if(!in_array($ext,$type)){
ShowMsg('上传类型有误,请重新选择');
return false;
}
// 判断所存放文件的目录是否存在
if(!is_dir($path)){
// 如果文件夹不存在,则创建文件夹
// true 是否递归创建
$CreatRes = mkdir($path,0777,true);
if(!$CreatRes)
{
ShowMsg('文件夹创建失败');
return false;
}
}
// 给上传的文件起一个新的名字 时间不会重复
// 纯文件名
$filename = pathinfo($file['name'],PATHINFO_FILENAME);
// // 时间戳
$time=time();
// // 拼接新名字
$newname=$filename.'_'.$time.'.'.$ext;
$newname =$path.'/'.$newname;
// var_dump($newname);
// exit;
// 判断文件上传渠道是否正确 安全问题
if(!is_uploaded_file($file['tmp_name'])){
ShowMsg('非法上传文件');
return false;
}
// 真正上传 实际上就是移动 路径加文件名
return move_uploaded_file($file['tmp_name'],$newname);
}
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2022-8-25 09:26:04修改
赞
收藏
回复
相关推荐