1.1 客户端上传设置
文件上传已经成为B/S程序中的常用功能。 目的是客户可以通过浏览器(Browser)上传文件到服务器(Server)上的指定目录。
网上常见的支持文件上传的网站:
各种云盘
头像
网络相册
已验证
电子邮件附件
简单来说,Web开发需要用户传递给服务器的所有文件都属于PHP的上传类别。 服务器只能接受副本,除非它不执行此功能。
就像10086客服一样,只要你打电话,它就会受理。 如果不接受,只能说明服务器正忙。
PHP文件上传的基础知识:
1)客户端form表单设置
2)服务器处理上传的文件
必须设置的表单项:
文件上传
选择文件:
注意几个特征属性:
1.文件必须使用post方式上传,不能使用get方式。
2. 请务必在表单中写入enctype="multipart/form-data"。
3. 输入表格必须写上姓名。
1.2 在服务器端通过PHP处理上传
上传文件的接收和处理是通过PHP脚本来处理的,具体需要以下三方面的信息:
1)设置PH配置文件中的指令:用于微调PHP的文件上传功能。
2)$FILES多维字段:用于存储上传文件相关的各种信息。 其他数据仍然使用$_POST获取。
3)PHP文件上传处理函数:用于对上传文件进行后续处理。
1)PHP配置文件中与文件上传相关的选项。
2) $_FILES 多维字段。
超级全局字段$_FILES
1、$_FILES["myfile"]["name"]中的值为:客户端文件系统中文件的名称。
2、$FILES["myfile"]["type"]中的值为:客户端传递过来的文件的类型。
3、$_FILES["myfile"]["size"]中的值为:文件的字节大小。
4、$_FILES["myfile"]["tmp_name"]中的值为:文件上传后存储在服务器上的临时完整路径。
5、$_FILES["myfile"]["error"]中的值为:文件上传的错误码——php4.2之后减少的功能。
关于文件上传错误的错误代码:
上传_ERR_确定
其值为0,没有发生错误,文件上传成功。
上传_ERR_INI_SIZE
其值为1,上传的文件超出了php.ini中upload_max_filesize选项的限制值。
上传_ERR_FORM_SIZE
如果其值为2,则上传文件的大小超过HTML表单中MAX_FILE_SIZE选项指定的值。
上传_错误_部分
当值为3时,仅上传部分文件。
上传_ERR_NO_FILE
它的值为4php 下载大文件,没有上传文件。
上传_ERR_NO_TMP_DIR
其值为6,找不到临时文件夹。 引入了PHP4.3.10和PHP5.0.3。
上传_ERR_CANT_WRITE
其值为7,文件写入失败。 PHP5.1.0推出。
注:以上值在PHP4.3.0之后已成为PHP常量。
通用数据格式 (MIME)
3)PHP文件上传处理函数
上传成功的文件会被放置在服务器端临时目录中,文件名是随机生成的临时文件名。
注意:程序执行后该文件将被手动删除。
您可以像操作本地文件一样操作它,然后再删除它。
文件上传处理函数:
is_uploaded_file—确定文件是否通过 HTTPPOST 上传。
格式:boolis_uploaded_file(字符串$文件名)
move_uploaded_file - 将上传的文件移动到新位置。
格式:boolmove_uploaded_file(字符串$文件名,字符串$目的地)
注意:如果目标文件已经存在,则会被覆盖。
参数说明:临时文件目录,要连接的位置目录
案件:
1)设置后端上传接口
Document
2)doup.php处理上传到临时目录的文件
//专业搬运工具
//move_uploaded_file()
//参数1:文件临时目录 参数2: 要移动到的位置
//is_uploaded_file() 判断文件是否是http post提交过来的
//参数1:文件临时目录
//1.我们保存的路径按照时间来创建
//var_dump($_GET);
//1.1保存的路径
$dir='./biran/'.date('Y/m/d/');
//echo $dir;exit;
//1.2 判断文件上传的路径是否存在 如果不存在就创建
if(!file_exists($dir)){
mkdir($dir,777,true);
}
//2.要有个好的文件名 唯一的文件名
//2.1获取文件的后缀名
//2.jpg jpg
$suffix = pathinfo($_FILES['pic']['name'],PATHINFO_EXTENSION);
//echo $suffix;
//2.2重新起名
$filename = date('Ymd').uniqid().mt_rand(0,9999).'.'.$suffix;
//echo $filename;
//开始搬运
//判断是否是http post 传递的文件
if(!is_uploaded_file($_FILES['pic']['tmp_name'])){
//不是http post上传文件
echo '别整没用的!!';exit;
}
//开始真正的搬运
if(move_uploaded_file($_FILES['pic']['tmp_name'],$dir.$filename)){
echo '11111111111';
}else{
echo '22222222222';
}
封装成一个函数:
想法:
function upload(){
//1.判断文件上传错误
//2.判断你文件上传的类型是否是你想要的类型
//3.起名字
//4.判断保存路径是否存在
//5.判断是否是http post方式上传
//6.移动图片
//7.返回移动成功的图片名
}
开始封装函数:新建function.php
<?php
/*
文件上传函数
@param string $name 文件上传文件域的name值
@param string $dir 文件保存路径
@param array $allow 文件允许上传的类型
return string $filename 文件名 如果失败 返回false
*/
function upload($name,$dir='./upload/',$allow=array('jpg','gif','jpeg','png')){
//echo $name;exit;
//var_dump($_FILES);exit;
//1.判断文件上传错误
if($_FILES[$name]['error']>0){
//echo '上传错误';
switch($_FILES[$name]['error']){
case 1:
echo '上传的文件超过了 php.ini 中upload_max_filesize 选项限制的值.';
break;
case 2:
echo '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
break;
case 3:
echo '文件只有部分被上传.';
break;
case 4:
echo '没有文件被上传.';
break;
case 6:
echo '找不到临时文件夹.';
break;
case 7:
echo '文件写入失败.';
break;
}
return false;
}
//2.判断你文件上传的类型是否是你想要的类型
//2.1允许上传的类型
//2.2 获取后缀名
$suffix = pathinfo($_FILES[$name]['name'],PATHINFO_EXTENSION);
//echo $suffix;exit;
//2.3 判断是否是我们允许上传的类型
//var_dump(in_array($suffix,$allow));exit;
if(!in_array($suffix,$allow)){
//不允许上传的类型
echo '大哥你的上传类型不符合';
return false;
}
//3.起名字
$filename = date('Ymd').uniqid().mt_rand(0,9999).'.'.$suffix;
//echo $filename;exit;
//4.判断保存路径是否存在
//4.1 得到保存路径
//4.2 处理保存路径和后面的斜杠
$save_path = rtrim($dir,'/');
$save_path .='/';
//4.3 保存路径中的时间文件夹处理
$save_path .=date('Y/m/d/');
//4.4 判断保存的路径是否存在
if(!file_exists($save_path)){
mkdir($save_path,777,true);
}
//4.5 拼接一个完整的保存路径
$path = $save_path.$filename;
//echo $path;exit;
//5.判断是否是httppost方式上传
if(!is_uploaded_file($_FILES[$name]['tmp_name'])){
echo '滚蛋!';
return false;
}
//6.移动图片
if(!move_uploaded_file($_FILES[$name]['tmp_name'],$path)){
echo '移动失败';
return false;
}
//7.返回移动成功的图片名
return $filename;
}
调用该函数开始上传:
<?php
include './function.php';
//var_dump($_FILES);exit;
echo upload('file','./leiding',array('jpg','png'));
第二章 多文件上传
2.1 上传多个不同名称的文件
当需要上传多个文件时,有两种解决方案:
1)使用不同的表单元素。
2)使用链表格式的表单元素。
第三章 文件下载
1)对于浏览器无法识别的文件,可以通过连接直接下载。
<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)如果浏览器无法识别php 下载大文件,可以使用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);
发表评论