php实现文件上传与下载 文件上传的原理:通过客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定的目录即可
1.文件上传配置
客户端的配置 1、表单页面 2、表单的发送方式为post 3、添加enctype=“multipart/form-data” $_FILES中保存着上传文件的信息 ·name:上传文件的名称 ·type:上传文件的MIME类型(通过MIME类型 服务器可以识别上传的文件是什么类型) ·tmp_name:上传到服务器上的临时文件名 ·size:上传文件的大小
2.服务器端的配置
文件上传 file_uploads = On 支持http上传 upload_tmp_dir 临时文件保存目录 upload_max_filesize 允许上传文件的最大值 max_file_uploads 允许一次上传的最大文件数 post_max_size POST方式发送数据的最大值 max_execution_time = -1设置解析器终止之前允许的最大执行时间 防止占用服务器资源 max_input_time = 60 脚本解析允许输入数据的最大时间 max_input_nesting_level = 64 设置输入变量的嵌套深度 max_input_vars = 1000,接受多少输入的变量(限制分别应用于
3.上传文件错误信息说明
·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,没有文件被上传。 错误信息中没有错误信息为5的。 ·UPLOAD_ERR_TMP_DIR:其值为6,找不到临时文件夹。 ·UPLOAD_ERR_CANT_WRITE:其值为7,文件写入失败。 ·UPLOAD_ERR_EXTENSION:其值为8,上传的文件被PHP扩展程序中断。
判断下错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功
客户端限制: ·通过表单隐藏域限制上传文件的最大值 ·通过accept属性限制上传文件类型 缺点:客户端做的限制对于会程序的人来说没有用。
4.服务器端限制文件上传类型
服务器端检测 文件是否是以HTTP POST方式上传的 is_uploaded_file(
服务器端确保 文件不重名
服务器端 指定目录不存在创建该目录
upload.php
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>PHP文件上传与下载</title></head><body> <form action="doAction.php" method="post" enctype="multipart/form-data"> 请选择您要上传的文件: <input type="file" name="myFile" id=""><br/> <input type="submit" value="上传文件"> </form></body></html>doAction.php
<?php //$_FILES 预定义文件上传变量 /*PRint_r($_FILES);*/ header('content-type:text/html;charset=utf-8'); require_once('upload.func.php'); $fileInfo = $_FILES['myFile']; echo uploadFile($fileInfo); //将服务器上的临时文件移动到指定目录下(两种方法) /*move_uploaded_file($tmp_name,$destination);移动成功返回true,否则返回false;该方法只用于POST表单上传的情况 move_uploaded_file($tmp_name, './uploads/'.$filename); copy($src,$dst) 将文件拷贝到指定目录下,拷贝成功返回true,否则返回true copy($tmp_name, './uploads'.$filename);*/?>upload.func.php
<?php //封装单文件上传函数 function uploadFile($fileInfo,$uploadPath='uploads',$flag=true,$allowExt=array('jpg','jpeg','gif','png'),$maxSize=2097152){ //检测错误号 if($fileInfo['error']>0){ switch ($fileInfo['error']) { case 1: $mes = '上传的文件超过了服务端配置中upload_max_filesize选项限制的值'; break; case 2: $mes = '上传的文件超过了HTML表单POST中MAX_FILE_SIZE选项限制的值'; break; case 3: $mes = '文件只有部分被上传'; break; case 4: $mes = '没有任何文件被上传'; break; case 6: $mes = '找不到临时的文件夹'; break; case 7: case 8: $mes = '系统文件错误'; break; } exit($mes); } //检测上传文件的类型 //$ext = strtolower(end(explode(',',$fileInfo['name'])));截取name后的字符串 $ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION); /*$allowExt = array('jpg','jpeg','gif','png');*/ if(!in_array($ext,$allowExt)){ exit('非法类型的文件'); } //检测上传的文件大小是否符合要求 /*$maxSize = 2097152; //自定义2M*/ if($fileInfo['size']>$maxSize){ exit('文件过大,不符合规范'); } //检测文件是否是正确的图片文件 if($flag){ if(!getimagesize($fileInfo['tmp_name'])){ exit('不是正确的图片类型'); } } //检测文件是否是HTTP POST方式上传的 if(!is_uploaded_file($fileInfo['tmp_name'])){ exit('文件不是以HTTP POST方式上传的'); } //移动临时文件 /*$uploadPath = 'uploads';*/ $uniqName = md5(uniqid(microtime(true),true)).".".$ext; $destination = $uploadPath."/".$uniqName; if(!file_exists($uploadPath)){ mkdir($uploadPath,0777,true); chmod($uploadPath, 0777); } if(!@move_uploaded_file($fileInfo['tmp_name'], $destination)){ exit('文件上传失败'); } return $destination; }新闻热点
疑难解答
图片精选