一、文件上传
文件上传的基础知识:
- 首先,在客户端form表达设置,选择上传的文件
- 然后,在服务器对上传文件进行操作处理
1.1 关于前台页面
必须设置 form 表单项:
<html>
<head><title>文件上传</title></head>
<body>
<from action="./upload.php" method="post" enctype="multipart/form-data">
选择文件: <input type="file" name="myfile">
<input type="submit" value="上传文件">
</from>
</body>
</html>
注意事项
1.2 后端的php程序
1.3 php的文件上传处理函数
案例:
前台页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<from action="./upload.php" method="post" enctype="multipart/form-data">//必须要写
选择文件:<input type="file" name="myfile">
<input type="submit" value="上传文件>
</from>
</body>
</html>
后台程序
<?php
header("Content-type:text/html;charset=utf-8");
// myfile 是前台的html页面中的name属性的值
// $_FILES['myfile']['error'] 数组可以判断是否上传成功
if ($_FILES['myfile']['error'] > 0){
echo "上传发生错误".$_FILES['myfile']['error']."<br>";
}else{
echo "文件上传成功<br>";
echo "文件名称:".$_FILES['myfile']['name']."<br>";
echo "文件类型:".$_FILES['myfile']['type']."<br>";
echo "文件大小:".$_FILES['myfile']['size']."<br>";
echo "文件临时存储位置:".$_FILES['myfile']['tmp_name']."<br>";
# $_FILES['myfile']['name'] 保存的文件名,但是文件名如果有中文,会导致失败
# 用 iconv 将文件名编码修改为gbk
# 最终用 $fileName 保存修改编码后的文件名
$fileName = iconv("UTF-8","GBK",$_FILES['myfile']['name']);
// 将临时存储的文件移动到当前位置下的abcd目录中
// 移动过去后将文件名修改为原始名字
$res = move_uploaded_file($_FILES['myfile']['tmp_name'],"./abcd/".$fileName);
if($res)
{
// 最后在页面上需要显示文件名,所以需要将编码从gbk修改回utf-8
$fileName = iconv("GBK","UTF-8",$fileName);
echo "文件成功移动到./abcd/".$fileName;
}else{
echo "文件移动失败";
}
}
?>
1.4 扩展内容
PHP 配置文件中与文件上传有关的选项
指令名 | 默认值 | 功能描述 |
file_uploads | ON | 是否开启文件上传 |
upload_max_filesize | 2M | 限制PHP处理上传文件的最大值,此值必须小于post_max_size |
post_max_size | 8M | 限制通过POST方法可以接收信息的最大值,也就是整个POST请求的提交值。此值必须大于 upload_max_filesize |
upload_tmp_dir | NULL | 上传文件存放的临时路径,可以是绝对路径。默认NULL 则使用系统的临时目录。 |
max_file_uploads | 20 | 文件允许同时上传的个数 |
关于 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,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进
UPLOAD_ERR_CANT_WRITE: 其值为7,文件写入失败。PHP 5.1.0 引进
常见数据格式(MIME)
文件类型 | MIME 类型 |
图片文件 | image/gif,image/jpg,image/jpeg,image/png,image/x-png |
纯文本和HTML | text/txt,text/plan,text/html |
二进制文件 | application/octet-stream |
音频格式 | audio/basic |
视频格式 | video/mpeg |
案例:
参考版本
<?php
//第一步:明确服务器规定上传至服务器的文件类型。这里我们只允许上传以下类型的图片。
$allowedExts = array("git","jpeg","jpg","png");// 允许上传的图片后缀
//第二步:获取上传的文件名称,通过explorde()函数将其分割成字符串形式的数组。
$temp = explode(".",$_FILES['myfile']['name']);
echo $_FILE['myfile']['size'];
$extension = end($temp); //end函数用于获取数组中最后一个元素的值。
//第三步:列出上传文件需要满足的
if ((($_FILES['myfile']['type'] == 'image/gif')
|| ($_FILES['myfile']['type'] == 'image/jpeg')
|| ($_FILES['myfile']['type'] == 'image/jpg')
|| ($_FILES['myfile']['type'] == 'image/pjpeg')
|| ($_FILES['myfile']['type'] == 'image/x-png')
|| ($_FILES['myfile']['type'] == 'image/png'))
&& ($_FILES['myfile']['size'] < 204800 ) // 小于 200 kb
&& in_array($extension,$alloweExts)) //in_array表示在$allowedExts数组中查找$extension这个字符串
{
if ($_FILES["myfile"]["error"] > 0)
{
echo "错误::".$_FILES["myfile"]["error"]."<br>";
} else {
echo "上传文件名:".$_FILES["myfile"]["name"]."<br>";
echo "文件类型:".$_FILES['myfile']['type']."<br>";
echo "文件大小:".($_FILES['myfile']['size'] / 1024)."<br>";
echo "文件临时存储位置:".$_FILES['myfile']['tmp_name']."<br>";
// 判断当前目录(即www文件夹中)下的upload目录(自己创建,名字自取)是否存在该文件
// 如果没有upload目录,你需要创建它,upload目录权限为777
if (file_exists("upload/".$_FILES['myfile']['name']))
{
echo $_FILES['myfile']['name'].'文件已经存在。';
} else {
//如果upload目录不存在该文件则将文件上传到upload目录下
move_upload_file($_FILES['myfile']['tmp_name'],"upload/".$_FILES['myfile']['name']);
echo "文件存储在:"."upload/".$_FILES['myfile']['name'];
}
}
} else {
echo "非法的文件格式";
}
?>
多文件上传
二、 文件下载
2.1 对于浏览器不识别的文件,可以直接利用a链接下载
<!-- 因为他们三个浏览器不认识这样的类型 -->
<a href="./downlist/1.rar">1.rar</a>
<a href="./downlist/1.exe">1.exe</a>
<a href="./downlist/1.avi">1.avi</a>
2.2 对于浏览器不识别的,可以利用readfile函数
<!-- 浏览器人事这样的类型就会被解析 -->
<a href="./action.php?name=1.html">1.html</a>
<a href="./action.php?name=1.php">1.php</a>
<a href="./action.php?name=1.txt">1.txt</a>
<a href="./action.php?name=1.jpg">1.jpg</a>
//接收一下name值
$name = $_GET['name'];
//实现下载功能,强制浏览器弹出另存为对话框
header('content-Disposition:attachment;filename="'.$name.'"');
//此时只是下载了一个空文件,需要利用readfile读一遍所有的内容,便可下载。
$path = './downlist/'.$name;
readfile($path);
2.3 案例:
1、创建一个文件下载链接
2、创建一个文件下载处理脚本