php保存上传文件
包含文件的form的简单提交格式
样例代码:
<form method='post' enctype='multipart/form-data' action='index2.php'>
<input type='file' name='my_up_file' >
<input type='submit' name='btn' value="上传">
</form>
对于enctype的解释:
php中接收并保存form提交的单个文件简单格式
<?php
header('Content-type:text/html;charset=GBK');//特意改成gbk了,如果是utf-8,网页会中文乱码??
//print_r($_POST);
echo '<pre>';
/*var_dump($_POST);
var_dump($_FILES);*/
$file =$_FILES['my_up_file'];
var_dump($file);
if( is_uploaded_file($file['tmp_name']) ){ //$file['tmp_name'] 存取的就是临时文件的位置,调用此函数检测此文件是否为上传文件
if( move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name']) ){//移动临时文件到指定目录成功
echo '文件保存成功!';
}else{
echo '文件保存失败!';
}
}
php接收并保存form提交的多个文件简单格式(文件的name均不同时)
form代码:
<form method='post' enctype='multipart/form-data' action='index2.php'>
<input type='file' name='file1' >
<input type='file' name='file2' >
<input type='file' name='file3' >//name不同
<input type='submit' name='btn' value="批量上传">
</form>
php代码:
<?php
header('Content-type:text/html;charset=GBK');
//print_r($_POST);
echo '<pre>';
/*var_dump($_POST);
var_dump($_FILES);*/
/*$file =$_FILES['my_up_file'];
var_dump($file);*/
foreach($_FILES as $file){//非同名文件的遍历。遍历FILES中的值存到file中
//下面就可以用单文件的处理方式了
if( is_uploaded_file($file['tmp_name']) ){ //$file['tmp_name'] 存取的就是临时文件的位置,调用此函数检测此文件是否为上传文件
if( move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name']) ){//移动临时文件到指定目录成功
echo '文件保存成功!';
}else{
echo '文件保存失败!';
}
}
}
php接收并保存form提交的多个文件简单格式(文件的name均相同时)
form代码:
<body>
<form method='post' enctype='multipart/form-data' action='index2.php'>
<input type='file' name='file_up[]' >//很简单,和复选框同理加上在name后面加上[]
<input type='file' name='file_up[]' >
<input type='file' name='file_up[]' >
<input type='submit' name='btn' value="批量上传">
</form>
</body>
php代码:
<?php
header('Content-type:text/html;charset=GBK');
echo '<pre>';
var_dump($_FILES);
if(!isset($_FILES['file_up']['name'] ) ){
echo '错误!未上传文件!';
}else if(!is_array($_FILES['file_up']['name']) ){
echo '错误!name元素只有一个,证明只上传了一个文件,无法使用下面方法';
}else{
echo '开始上传同name多文件!';
//print_r($_FILES);
foreach($_FILES['file_up']['name'] as $k=>$name){//随便遍历一个数组,取出其下标k
if(is_uploaded_file($_FILES['file_up']['tmp_name'][$k] ) ){//该文件是上传文件
if( move_uploaded_file($_FILES['file_up']['tmp_name'][$k], 'uploads/'.$_FILES['file_up']['name'][$k]) ){//移动临时文件到指定目录成功
echo '文件'.$k.'保存成功!';
}else{
echo '文件'.$k.'保存失败!';
}
}
else{
echo '文件'.$k.'不是上传文件!';
}
}
}
函数封装文件上传
上面的处理只是最基本的操作,但实际设计中要考虑对错误的处理和反馈。用函数封装是个很好的方法。具体细节见下:
form代码:
<body>
<form method='post' enctype='multipart/form-data' action='my_upload_function.php'>
<input type='file' name='image' >
<input type='submit' name='btn' value="上传">
</form>
</body>
php函数代码:
<?php
//php单文件上传封装函数
/*
* 实现单文件上传
* @param1 array $file,需要上传的文件信息,一维5元素数组
* @param2 array $allow_type,允许上传的MINE类型
* @param3 string $path,存储的路径
* @param4 string $&error,引用参数,用于返回错误原因
* @param5 array $allow_format =array(),允许上传的文件格式
* @param6 int $max_size =2000000,允许上传的最大值
*/
function upload_single_file($file,$allow_type,$path,&$error,$allow_format =array(),$max_size){
//判断file是否有效
if(!is_array($file) || !isset($file['error'] ) ){
//文件不是数组(保证后面用到数组下标不报错)或者此数组没有error信息
$error ='不是一个有效的上传文件!';
return false;
}
//判断path是否有效
if(!is_dir($path) ){
$error ='存储路径不存在!';
return false;
}
//判断的文件上传过程是否出错
switch($file['error']){
case 1://1和2是一样错误
case 2:
$error = '文件超出服务器允许大小!';
return false;
case 3:
$error = '文件上传过程中出现问题,只上传了一部分!';
return false;
case 4:
$error = '用户未选中文件!';
return false;
case 6:
case 7:
$error = '服务器错误,文件保存失败!';
return false;
}
echo '<pre>';
print_r($file);
//判断MIME类型
if(in_array($file['type'],$allow_type) ==false ){
//此文件类型不允许上传
$mid_string= implode('|',$allow_type);//使用数组转string
$error = '此文件类型不允许上传,只允许上传的类型:'.$mid_string;
return false;
}
print_r($file['name']);
//判断后缀
$ext=ltrim(strrchr($file['name'],'.'),'.' ) ;//strrchr取得文件名后缀,ltrim去除后缀前面的'.'
if(!empty($allow_format)&& !in_array($ext,$allow_format) ){
//不允许上传
$error= '此文件的格式不允许上传!';
return false;
}
//判断文件大小与max_size的比值
if($file['size'] > $max_size){
//文件过大
$error = '当前上传的文件超出大小,最大允许:'.$max_size;
return false;
}
//构造文件名,并移到指定目录
$fullname = strstr($file['type'],'/',TRUE).date('YYYYmmdd');//添加文件类型+日期
for($i=0; $i<4; $i++){
$fullname.=chr(mt_rand(65,90) );//随机添加4个大写字母(目的是尽可能防止文件重名)
}
$fullname .='.'.$ext;
if(!is_uploaded_file($file['tmp_name']) ){
$error = '错误,不是上传文件';
return false;
}
if(move_uploaded_file($file['tmp_name'],$path.'/'.$fullname) ==false){
$error = '服务器错误!文件上传失败';
return false;
}
else{
return $fullname;
}
}
echo 'start';
$file = $_FILES['image'];
$path = 'uploads';
$allow_type = array('image/jpg','image/jpeg','image/gif','image/pjpeg','image/png');
$allow_format = array('jpg','gif','jpeg');
$max_size = '8000000';
if( $filename=upload_single_file($file,$allow_type,$path,$error,$allow_format,$max_size) ){
echo $filename;
}
else{
echo $error;
}
?>
总结
学习提交文件这部分内容就花了6个小时多,用到了很多函数,而且写代码的时候还是不自觉的当成C的语法…慢慢习惯吧,任重而道远。