文件上传原理
将客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定目录即可
文件上传配置
客户端配置:
1)表单页面 2)表单的发送方式为post 3)添加enctype=”multipart/form-data”属性
服务器配置:
1)file_uploads = on
2)upload_tmp_dir = 临时文件保存的目录
3)upload_max_filesize = 2M 允许上传文件的最大值
4)max_file_uploads = 20 允许一次上传的最大文件数
5)post_max_size = 8M post方式发送数据的最大值
文件上传配置Resoutce Limits
1)max_execution_time = -1 设置脚本被解析器终止之前允许的最大执行时间,单位秒,防止程序写的不好而占尽服务器资源
2)max_input_time = 60 脚本解析输入数据允许的最大时间,单位秒
3)max_input_nesting_level = 64 设置输入变量的嵌套深度
4)max_input_vars = 1000 接受多少输入的变量(相纸分别应用于
GET,
_POST和$_COOKIE超全局变量)指令的使用减轻了以哈希碰撞来进行拒绝服务器共计的可能性,如有超指令数量的变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断;
5)memory_limit = 128M 最大单线程的独立内存使用量,也就是一个web请求,给予线程最大的内存使用量的定义
错误信息说明
1)upload_err_ok 其值为0,没有发生错误,文件上传成功;
2)upload_err_ini_size 其值为1,上传的文件超过了php.ini中upload_max_filesize选项限制的值
3)upload_err_form_size 其值为2,上传文件的大小超过了HTML表单中max_file_size选项指定的值
4)upload_err_partial 其值为3,文件只有部分被上传
5)upload_err_no_file 其值为4,没有文件被上传
6)upload_err__no_tmp_dir 其值为6,找不到临时文件夹
7)upload_err_extension 其值为8,上传的文件被php扩展程序中断
文件上传限制
客户端限制:
1)通过表单隐藏域吸纳之上传文件的最大值
<input type='hidden' name='MAX_FILE_SIZE' value='字节数' />
2)通过accept属性限制上传文件的类型
<input type='file' name='myfile' accept='文件的MIME类型' />
服务器端限制:
1)限制上传文件大小
2)限制上传文件类型
3)检测是否为真实图片类型
4)检测是否为HTTP POST方式上传
<?php
header('content-type:text/html;charset=utf-8');
$myfile=$_FILES['myfile'];
$tmp=$myfile['tmp_name'];
$path="./images/".$myfile['name'];
if(!move_uploaded_file($tmp,$path)) die('上传失败');
mysql_connect('www.phpc.com','root','root');
mysql_query('use dbname');
mysql_query('set names utf8');
//图片路径
$sql="insert into img values(null,'$path')";
$res=mysql_query($sql);
if($res){
echo "ok";
header('refresh:1;show.php');
}else{
echo "no";
}
?>
文件下载
<?php
//传值
$path=$_GET['path'];
//获取文件名
$filename=basename($path);
//获取文件的类型
header('content-type:image/jpeg');
//激活下载窗口
header("Content-Disposition: attachment; filename=$filename");
header('content-length:'.filesize($filename));
//读取文件
readfile($path);
?>
应用函数:
$_FILES() 获取文件信息
basename() 返回路径中的文件名部分
dirname(__FILE___) 函数返回的是脚本所在在的路径
pathinfo() 返回文件路径的信息
strtolower() 将字符串转化为小写
end() 将数组的内部指针指向最后一个单元
explode() 使用一个字符串分割另一个字符串
filesize() 取得文件大小
array_filter() 用回调函数过滤数组中的单元
array_values() 返回数组中所有的值
getimagesize() 取得图像大小
uniqid() 生成一个唯一ID
microtime() 返回当前 Unix 时间戳和微秒数
mkdir($path,0777,true) 新建目录
is_uploaded_file() 判断文件是否是通过 HTTP POST 上传的
move_uploaded_file() 将上传的文件移动到新位置
in_array() 检查数组中是否存在某个值