php文件上传

文件上传

文件上传: 将文件从本机电脑上传到服务器电脑.


文件上传条件

1.      服务器允许用户上传文件: apache不能处理文件: PHP才能处理

a)      文件是否允许上传


b)     文件上传到服务器之后保存到什么位置

 

2.      浏览器需要上传条件

a)      浏览器需要表单: form, 只能POST提交


b)     表单中必须使用文件上传表单域: <input type=”file”>


c)      文件是二进制数据: 但是表单默认只能提交字符流数据: 如果要实现提交,需要告诉浏览器: 当前内容中有二进制数据, 需要在表单中增加一个文件上传的属性: enctype=”multipart/form-data”

 

 

PHP接收文件

如果文件上传的表单域存在: 但是没有给form增加enctype属性: 文件不可能上传, 但是表单可以上传: 上传的数据很明显会被$_POST接收.

 

PHP中接收文件上传信息: 由$_FILES超全局预定义变量实现

 

之所以看不到文件: PHP没有处理,就会被系统回收: 系统在PHP脚本执行结束,php没有处理,操作系统自动回收: 如何让脚本执行周期变长?Sleep(10): 休息10秒

 

 

 

 

移动文件

文件上传本质是系统接收: 跟PHP没有关系, PHP只是在脚本周期内有权利去访问存在的临时文件: 如果不处理,操作系统会自动清理: 在PHP可以操作的周期内,将临时文件移动到目标文件夹内,然后给其新的名字(临时文件不能使用)

 

PHP提供了一个系统函数能够移动文件(专门移动上传的文件)

Move_uploaded_file(临时文件路径, 目标路径);        //两个路径都带文件名(copy())

 

文件上传错误

文件在上传的过程中,很有可能出现多种错误: 用户根本没有选中要上传的文件,或者网络不稳定等,都有可能出现错误: 而这种错误不是由PHP来抓取: PHP只负责处理最终由系统接收好的临时文件.

 

系统在接收文件的过程中,会将已经出现的错误信息变成对应的错误代码error提示PHP: PHP根据错误提示进行相应的处理.

 

 

封装文件上传函数

为了以后要使用上传文件功能是可以方便些,把它封装成一共函数,到时候就可以直接调用了

1.      创建一个单独的文件: 里面只存放上传文件的函数


2.      确定需要实现上传函数的参数: 要上传的文件数组信息, 要上传的文件路径, 允许上传的类型数组, 当前允许的大小(size)有默认值


3.      确定返回值: 成功返回文件的新名字, 失败返回false


4.      因为文件上传会出现错误:要将错误信息反馈出来: 引用传递错误信息


5.      判断文件文件信息

a)      判断文件信息是否有效: 必须是数组,而且必须是5个元素数组


b)     判断系统错误(文件中的error信息)


c)      判断文件类型是否合法: 如果类型不再允许的类型数组中


d)     判断文件大小是否符合当前要求


6.      需要对文件进行重命名: 时间 + 随机字符串: 新建一个函数专门产生随机名字

 

7.      移动文件到指定目录


8.      验证函数是否正确: 调用


完整代码

<?php

	//文件上传函数


	/*
	 * 实现文件上传
	 * @param1 array $file,要上传的文件信息(文件五要素数组)
	 * @param2 string $path,要上传的文件路径
	 * @param3 array $allow,允许上传是文件类型(MIME)
	 * @示例 $allow = array('image/jpg','image/jpeg'...)
	 * @param4 string &$error,用来记录错误信息的变量
	 * @param5 int $maxsize = 1000000, 默认为1M
	 * @return 成功返回新的文件名,失败返回false
	*/
	function uploadFile($file,$path,$allow,&$error,$maxsize = 1000000){
		//判断文件是否有效
		if(!is_array($file) || count($file) != 5){
			//文件无效
			$error = '无效文件,不能上传!';
			return false;
		}

		//判断系统错误(系统在接收数据的时候发现的错误)
		switch($file['error']){
			case 1:	//文件超过服务器允许的大小
				$error = '文件超过服务器允许的大小!';	//ini_get('upload_max_filesize')获取配置文件中指定配置项的值
				return false;
			case 2:	//超过浏览器表单允许大小
				$error = '文件超过表单允许大小!';
				return false;
			case 3: //上传部分
				$error = '文件只有部分上传成功!';
				return false;
			case 4:	//没有选中文件
				$error = '没有选中要上传的文件!';
				return false;
			case 6:
			case 7:
				$error = '服务器错误!';
				return false;
		}

		//判断文件类型是否合法
		if(!in_array($file['type'],$allow)){
			//类型不存在
			$error = '当前文件的类型不合法!';	//增加允许的类型
			return false;
		}

		//判断文件的大小是否满足当前需求
		if($file['size'] > $maxsize){
			//超出大小
			$error = '文件超出当前允许的范围!'; //告诉用户大小
			return false;
		}

		//获取文件的新名字
		$filename = getRandomName($file['name']);

		//移动文件
		if(move_uploaded_file($file['tmp_name'],$path . '/' . $filename)){
			//D:/server//20150923abcdef.jpg
			//移动成功: 返回名字
			return $filename;
		}else{
			//移动失败
			$error = '文件移动失败!';
			return false;
		}
	}

	/*
	 * 生成随机名字: YYYYMMDDHHIISS + 随机6为字符串(小写字母)
	 * @param1 string $filename,原始文件的名字
	 * @return string $newname,新的文件名字
	*/
	function getRandomName($filename){
		//生成时间部分名字
		$newname = date('YmdHis');

		//获取随机部分
		$str = 'abcdefghijklmnopqrstuvwxyz';
		for($i = 0;$i < 6;$i++){
			//每次从字符串中取一个
			$newname .= $str[mt_rand(0,strlen($str)-1)];
		}

		//补全后缀名
		return $newname . strrchr($filename,'.');
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值