php文件上传

2014年05月01日

通过 PHP,可以把文件上传到服务器

###什么是文件上传 把浏览器所在电脑的文件存放到服务器上, 这个过程称之为文件上传

上传分为两个部分:

  1. 将浏览器所在电脑的文件选中,提交给服务器,服务器要接收文件.

  2. 服务器必须要接收文件: apache不能接收文件,PHP负责接收.

###前期准备 ####设置php.ini

  • 确保上传功能被打开
file_uploads = On
  • 设置上传文件的临时存放目录
upload_tmp_dir ="E:\PHP\upload"      #;设置文件上传临时保存路径,默认是在c:/windows/temp

####设置文件表单域

<input type=’file’ name=’myfile’>

####设置post提交二进制

enctype=”multipart/form-data”

####$_FILES获取的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
array(1) {
  ["myfile"]=>
  array(5) {
    ["name"]=>											#上传文件的文件名
    string(10) "123123.jpg"
    ["type"]=>											#上传文件的类型:大类型/格式  称为MIME类型
    string(10) "image/jpeg"
    ["tmp_name"]=>										#上传到服务器时临时存储文件路径
    string(38) "E:\PHP\upload\php7FC2.tmp"
    ["error"]=>											#错误描述码
    int(0)
    ["size"]=>											#上传文件大小
    int(6340)
  }
}

###使用的函数

  • Move_uploaded_file(文件所在目录[文件名], 文件要存储的目录[带文件名])移动文件–>原文件不存在
  • Copy(文件所在目录,文件要存储的目录复制文件–>原文件存在

###使用时注意的问题

  • move_uploaded_file()会事先检测源文件是否通过php上传过来的,否则不予移动(只能用post)
  • move_uploaded_file()这个函数虽然多次调用但是只能执行一次,原因就在于move_uploaded_file()只支持post提交的信息,也就是用户只提交了一个post,第一次调用被执行后,之后就不是post的值也就是说不在执行了,解决办法就是用copy代替move_uploaded_file()

###封装一个上传文件函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
	/*
	 * 上传文件
	 * @param1 array $file,要上传的文件信息
	 * @param2 string $path,文件要上传的路径
	 * @param3 string &$error,记录错误信息
	 * @return string 文件的名字(新名字)
	*/
	function upload($file,$path,&$error){
		//定义错误信息: 专门记录错误: 在函数外部能访问
		//验证$file的合法性
		if(!is_array($file)){
			//不是数组
			$error = '上传文件不合法!';
			return false;
		}
		//验证系统错误处理
		switch($file['error']){
			case 1:
				$error = '文件过大,超过服务器允许的大小!';
				return false;
			case 2:
				$error = '文件超过浏览器允许的大小!';
				return false;
			case 3:
				$error = '文件只上传部分!';
				return false;
			case 4:
				$error = '用户没有选中要上传的文件!';
				return false;
			case 6:
			case 7:
				$error = '服务器错误!';
				return false;
		}
		//都没有错误: 移动文件
		$filename = getRandomName($file['name']);
		if(@move_uploaded_file($file['tmp_name'],$path . '/' . $filename))
		{
			//成功
			return $filename;
		}else{
			//失败
			$error = '文件移动失败!';
			return false;
		}
	}
	/*
	 * 生成文件名: YYYYmmddHHIISS + 随机6位字符串
	 * @param1 string $name,文件原始名字: 在浏览器所在电脑的名字
	 * @return string 新的名字
	*/
	function getRandomName($name){
		//构造时间日期部分
		$newname = date('YmdHis');
		//获取随机部分
		$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
		//随机取6位
		for($i = 0; $i < 6;$i++){
			//每次随机取一位
			$newname .= $str[mt_rand(0,strlen($str) - 1)];
		}
		//构造后缀名
		$newname .= strrchr($name,'.');
		//返回
		return $newname;
	}

版权所有:Arrow的代码之路    粤ICP备17138539号-1