弱鸡养成第二天(2020.10.18)-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的语法…慢慢习惯吧,任重而道远。

好好学习,天天向上!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值