文件和目录

和昨天一样,真正详细的补充在昨天的那片博客里面。

函数详解(部分)

fopen

fopen($filename,$mode[,$use_include_path[,$zcontext]]);
$filename : 要打开的文件名或 URL
$mode: 打开文件的模式
$use_include_path: 可选参数,规定是否在 include_path 中搜索文件
$zcontext: 可选参数,文件句柄的环境设置,为一个资源

附加-mode参数说明

只读:只能读取不能修改
只写:只能写入不能读取

mode 说明
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,否则行为同 'w'。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。在这种情况下,fseek() 没有效果,写入总是追加。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。在这种情况下,fseek() 只相应读取位置,写入总是追加。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 false,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL
'x+' 创建并以读写方式打开,其他的行为和 'x' 一样。
'c' Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file. This may be useful if it's desired to get an advisory lock (see flock()) before attempting to modify the file, as using 'w' could truncate the file before the lock was obtained (if truncation is desired, ftruncate() can be used after the lock is requested).
译文(大略):
打开文件仅供写入。如果该文件不存在,则创建该文件。如果它存在,它既不会被截断(与“ w”相反) ,对该函数的调用也不会失败(与“ x”的情况一样)。文件指针定位在文件的开头。如果希望在尝试修改文件之前获得一个通知锁(请参阅 ) ,那么这可能很有用,因为使用‘ w’可能会在获得锁之前截断文件(如果需要截断,则可以在请求锁之后使用 fruncate ()))。
'c+' Open the file for reading and writing; otherwise it has the same behavior as 'c'.
译文:
打开该文件进行读写; 否则它的行为与“ c”相同。
'e' Set close-on-exec flag on the opened file descriptor. Only available in PHP compiled on POSIX.1-2008 conform systems.
译文:
在打开的文件描述符上设置 close-on-exec 标志。(7.0.16, 7.1.2 新增 ‘e’ 选项。)

文件上传

html部分要求

<?php
// 提到最顶,设置下文件编码
header('Content-type:text/html;charset=utf-8');
?>
// form是表单
// method="post" 上传的模式为post
// action="upload.php" 上传到某个php文件进行处理
// enctype="multipart/form-data" 文件上传所必须的属性(必须要的):指示表单将包含二进制数据
// form内部部分就不多做解释了
<form method="post" action="upload.php" enctype="multipart/form-data">
// 限制上传文件的类型 限制上传文件的大小,单位是字节
<input type="file" name="file" accept=".jpg,.gif,.png" maxlength="2097152">
<button type="submit">Upload</button>
</form>

php部分

配置php.ini

配置php.ini,实现文件的上传功能。

// 服务器接受http上传
file_uploads = On
//
memory_limit
// 设置上传大小限制
upload_max_filesize = 2M
// post请求允许的最大数据量
post_max_size = 2M
// 置文件上传时的临时存储目录。如果不设置,则使用系统默认的临时目录。
upload_tmp_dir = /tmp

// 控制内存的使用阈值,超过则出现致命错误停止运行
// 默认值通常为 128M
memory_limit = 256M

$_FILES(处理上传的form文件数据)

用于处理上传文件的超全局变量/多维数组。

// $_FILES使用的前提:form表单的form标签处必须要有enctype="multipart/form-data"
// 参数如下:
name: 文件的原始名称。
type: 文件的 MIME 类型。
tmp_name: 文件上传后存储在服务器上的临时文件名。
error: 文件上传过程中可能产生的错误代码。
UPLOAD_ERR_OK (0): 没有错误,文件上传成功。
UPLOAD_ERR_INI_SIZE (1): 上传的文件大小超过了 php.ini 中 upload_max_filesize 指令的限制。
UPLOAD_ERR_FORM_SIZE (2): 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 指令的限制。
UPLOAD_ERR_PARTIAL (3): 文件只有部分被上传。
UPLOAD_ERR_NO_FILE (4): 没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR (6): 没有找到临时文件夹。
UPLOAD_ERR_CANT_WRITE (7): 文件写入磁盘失败。
UPLOAD_ERR_EXTENSION (8): PHP 扩展停止了文件上传。
size: 文件大小,以字节为单位。

<?php
if(isset($_FILES['file'])) {
$file_name = $_FILES['file']['name'];
$file_size = $_FILES['file']['size'];
$file_type = $_FILES['file']['type'];
$file_tmp = $_FILES['file']['tmp_name'];
$file_error = $_FILES['file']['error'];
// 进行文件上传的处理
}
?>

文件上传相关函数

is_uploaded_file() //函数用于检查指定的文件是否是通过 HTTP POST 上传的,是,则true,否,则false
move_uploaded_file() //函数用于将上传的文件从临时目录移动到指定目录,只移动HTTP POST上传的文件。
>>>下面是例子
$source = $_FILES['file']['tmp_name']; // 上传的临时文件路径

$destination = 'path/to/destination'; // 文件移动到的目标路径
if (move_uploaded_file($source, $destination)) {
// 文件移动成功
} else {
// 文件移动失败
}
>>> 例子结束

创建处理上传文件的php文件

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取上传的文件
$file = $_FILES['file'];

// 获取上传文件的基本信息
$filename = $file['name'];
$filetype = $file['type'];
$filesize = $file['size'];
$filetmp = $file['tmp_name'];
$fileerror = $file['error'];

// 对上传文件进行验证和过滤
if ($fileerror === UPLOAD_ERR_OK) {
// 上传文件保存到服务器上的指定目录中
$upload_dir = './uploads/';
$upload_path = $upload_dir . $filename;
move_uploaded_file($filetmp, $upload_path);

// 返回上传成功的反馈信息
echo 'Upload success!';
} else {
// 返回上传失败的反馈信息
echo 'Upload failed!';
}
}
?>

文件下载

使用header来实现使用php文件下载其他文件。(php相当于中转站)

指定文件类型

header('Content-type:MIME文件类型');

指定下载文件的描述

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

指定下载文件的大小

header('Content-Length:文件大小');

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

readfile();

附header

向服务端发送http报头。

除了Content-Type头,还有许多其他的HTTP头可以使用header()函数设置,例如:

Content-Length:表示响应内容的长度。
Cache-Control:控制缓存的行为,例如是否缓存、缓存时间等。
Location:重定向浏览器到新的URL。
Expires:设置响应过期的时间,通常与Cache-Control一起使用。
Set-Cookie:设置Cookie信息。

在使用header()函数时,需要注意以下几点:

header()函数必须在页面输出之前调用,否则会出现"Headers already sent"错误。
只能设置一个相同的HTTP头,如果设置多个相同的HTTP头,只有最后一个会生效。
在设置Location头时,需要注意不要输出任何内容,否则会出现"Cannot modify header information"错误。

总的来说,header()函数是一个非常有用的函数,可以帮助我们控制服务器返回的数据以及浏览器的行为。






// 其他参数
在PHP中,header()函数用于向客户端发送原始的HTTP头信息。它通常用于发送一些特殊的HTTP头信息,例如:响应状态码、重定向、缓存控制、字符集、内容类型、文件下载等。下面是一些常见的HTTP头参数及其含义:

响应状态码

语法:header('HTTP/1.1 404 Not Found');

含义:设置HTTP响应的状态码。

重定向

语法:header('Location: http://www.example.com/');

含义:设置重定向URL,浏览器会自动跳转到该URL。需要注意的是,重定向时必须使用绝对URL,否则可能会出现错误。

缓存控制

语法:header('Cache-Control: no-cache, no-store, must-revalidate');

含义:控制缓存的行为,例如是否缓存、缓存时间等。在上面的示例中,no-cache表示禁止缓存,no-store表示禁止存储缓存,must-revalidate表示必须重新验证缓存。

字符集

语法:header('Content-Type: text/html; charset=UTF-8');

含义:设置响应内容的字符集,通常与Content-Type一起使用。在上面的示例中,设置字符集为UTF-8

内容类型

语法:header('Content-Type: text/html');

含义:设置响应内容的类型。在上面的示例中,设置响应内容为HTML文档。

文件下载

语法:header('Content-Disposition: attachment; filename="example.txt"');

含义:设置响应内容为文件下载,并指定下载的文件名。在上面的示例中,将文件下载的Content-Disposition头设置为attachment,并指定文件名为example.txt。

自定义头信息

语法:header('X-My-Header: MyValue');

含义:设置自定义的HTTP头信息。在上面的示例中,设置自定义的HTTP头信息X-My-Header,值为MyValue。

需要注意的是,header()函数必须在页面输出之前调用,否则会出现"Headers already sent"错误。同时,header()函数只能设置一个相同的HTTP头,如果设置多个相同的HTTP头,只有最后一个会生效。在设置Location头时,需要注意不要输出任何内容,否则会出现"Cannot modify header information"错误。