本文实例讲述了php文件上传原理与实现方法。分享给大家供大家参考,具体如下:
文件上传实际上就是在前段使用一个form表单提交本地文件到服务器,然后在服务器端将文件从临时目录转移到指定目录的过程。
1、php配置文件
php.ini文件中的file uploads部分定义了相关文件上传配置,
- file_uploads = On 打开文件上传
- upload_tmp_dir =临时目录
- upload_max_filesize = 2M最大上传大小
- max_file_uploads = 20单次最大上传文件数
2、前端表单
1
2
3
4
|
< form action = "test.php" method = "post" enctype = "multipart/form-data" >
< input type = "file" name = "myfile" >
< input type = "submit" value = "上传" >
</ form >
|
当使用由文件上传控件的表单时,必须将form的enctype设置为"multipart/form-data"。
可以在客户端对上传文件的大小与类型进行限制:
1
2
|
< input type = "hidden" name = "MAX_FILE_SIZE" value = "8096" >
< input type = "file" name = "myfile" accept = "image/jpeg,image/png" >
|
3、后台处理
上传后会在服务器端得到一个$_FILES文件数组如下:
上传到服务器的临时文件默认保存在php.ini中upload_tmp_dir所设置的目录下,我们需要将文件移动到指定位置:
1
2
3
4
5
6
7
8
9
10
|
<?php
header( 'Content-type:text/html;charset=utf-8' );
$myfile = $_FILES [ 'myfile' ];
//获取文件数组['myfile']的属性tmp_name与name
$tmp = $myfile [ 'tmp_name' ];
$picname = $myfile [ 'name' ];
//windows采用GBK编码,php采用utf-8编码,需要改变文件名的编码格式
$picname =iconv( 'utf-8' , 'GBK' , $picname );
//将零时文件$tmp移动到指定目录userpic并命名为$picname
copy ( $tmp , "userpic/" . $picname );
|
file_uploads=On | 开启HTTP上传 |
upload_tmp_dir | 临时文件保存目录 |
upload_max_filesize=2M | 最大上传文件大小 |
post_max_size=8M | POST方式传输最大数据值 |
max_file_uploads | 一次上传最大文件数 |
memory_limit=128M | 单线程最大内存占用量 |
max_excution_time=-1 | 脚本解析所允许的最大执行时间(s),默认为-1未开启 |
4、错误处理
对file数组中的error属性进行判断处理:
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
|
$error = $myfile [ 'myfile' ][ 'error' ];
if ( $error ==0){ //为0,代表上传成功
if (move_uploaded_file( $tmp , "userpic/" . $picname )) {
echo "移动文件成功" ;
} else {
echo "移动文件失败" ;
}
} else { //不为0,匹配错误信息
switch ( $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 7: //文件写入失败
case 8:
echo "系统错误" ;
break ;
}
}
|
5、上传限制
在前端可以对上传的文件类型,大小进行限制:
1
2
3
4
|
<!--表单隐藏域对上传大小进行限制-->
< input type = "hidden" name = "MAX_FILE_SIZE" value = "2097152" >
<!--accept 对文件类型限制-->
< input type = "file" name = "myfile" accept = "image/jpeg,image/png" >
|
注意限制是以字节为单位
在服务器端也要做响应的限制:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$size = $myfile [ 'size' ]; //获取文件大小
$MaxSize =2097152; //设置最大允许字节
$type = $myfile [ 'type' ]; //获取图片类型
$AllowTypr = array ( 'image/jpeg' , 'image/png' , 'image/gif' ); //允许类型数组
if ( $error ==0){ //为0,代表上传成功
if ( $size > $MaxSize ){
echo "<script>alert('文件大小超过限制');</script>" ;
echo "<script>history.back(1);</script>" ;
exit ();
}
if (!in_array( $type , $AllowTypr )){
echo "<script>alert('请上传正确图片类型');</script>" ;
echo "<script>history.back(1);</script>" ;
exit ();
}
|
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/theVicTory/article/details/66472614