一、文件上传类
<?php
class uploadFile {
//默认设置
private $fieldname;
private $filename;//新的文件名
private $filepath='./uploads/';
private $maxsize=500000;//设置上传文件的大小:单位是B
private $allowtype=array('jpg','jpeg','gif','png');
//$_FILES传递的属性:在类中,这就相当于类中的“全局变量”
private $errorNum=0;//错误号(0:没有错误;正数:系统错误号;负数:自定义错误号;)
private $fileSize;//上传文件的大小
private $originalFileName;//源文件名(用于获取文件的拓展名)
private $tempFileName;//上传时的临时文件名(用于移动文件到指定目录)
private $filetype;
private $messageError;//单个文件上传错误消息
private $messageErrors=array();//多个文件上传错误消息
private $tempNewFileName;//不包含拓展名的文件名
private $filenames=array();//存放多个文件名
//用户可以不必按照顺序进行传递参数:可推广应用到其它类
function __construct($options=array()){
$arr=$this->getClassVarName();
foreach ($options as $key=>$v){
$key=strtolower($key);
if(in_array($key, $arr)){
$this->$key=$v;
}
}
}
/*
* uploadSingleFile():上传单张图片
* $files:上传文件资源句柄
* $fieldname:上传文件的表单名,本例中是'pic'
* $filename:新文件名(不需要指定拓展名)
* $filepaht:文件存放路径
* $allowtype:设定循序上传文件的类型
*
*/
function uploadSingleFile(){
if($this->checkFilePath()){
$this->tempNewFileName=$this->filename;
if($this->getFilesAttr()){//获取$_FILES传递的属性并赋值给类中的全局变量
if($this->checkError()){
return true;
}else{
$this->messageError=$this->getError();
return false;
}
}else{
$this->messageError=$this->getError();
return false;
}
}else{
$this->messageError=$this->getError();
return false;
}
}
function uploadMultipleFile(){
$return=true;
if($this->checkFilePath()){
$error=$_FILES[$this->fieldname]['error'];
$name=$_FILES[$this->fieldname]['name'];
$fileSize=$_FILES[$this->fieldname]['size'];
$tempFileName=$_FILES[$this->fieldname]['tmp_name'];
$this->tempNewFileName=$this->filename;
$count=count($name);
for ($i = 0; $i < $count; $i++) {
if($this->getMultipleFilesAttr($error[$i],$name[$i],$fileSize[$i],$tempFileName[$i])){
if(!$this->checkFileType() || !$this->checkFileSize()){
$this->messageErrors[]=$this->getError();
$return = false;
}
}else{
$this->messageErrors[]=$this->getError();
$return = false;
}
$this->getMultipleFilesAttr();
}
//移动文件:当没有错误时,才会移动所有文件
if($return){
for ($i = 0; $i < $count; $i++) {
if($this->getMultipleFilesAttr($error[$i],$name[$i],$fileSize[$i],$tempFileName[$i])){
if(!$return){
$this->messageErrors[]=$this->getError();
$return = false;
}elseif(!$this->checkMoving()){
$this->messageErrors[]=$this->getError();
$return = false;
}
}else{
$this->messageErrors[]=$this->getError();
$return = false;
}
$this->getMultipleFilesAttr();
}
}
return $return;
}else{
$this->messageErrors[]=$this->getError();
$return = false;
return $return;
}
}
/*
* 检查文件路径
*/
private function checkFilePath(){
if(empty($this->filepath)){
$this->errorNum=-1;
return false;
}
if(!file_exists($this->filepath) || !is_writable($this->filepath)){
mkdir($this->filepath,0755);
}
return true;
}
/*
* 检查错误
*/
private function checkError(){
if($this->checkFileType() && $this->checkFileSize()){
if(!$this->checkMoving()){
return false;
}else{
return true;
}
}else{
return false;
}
}
/*
* 检查文件类型
*/
private function checkFileType(){
$arr=explode('.', $this->originalFileName);
$this->filetype=strtolower($arr[count($arr)-1]);
if(!in_array($this->filetype, $this->allowtype)){
$this->errorNum=-2;
return false;
}else{
return true;
}
}
/*
* 检查文件大小
*/
private function checkFileSize(){
if($this->fileSize > $this->maxsize){
$this->errorNum=-3;
return false;
}else{
return true;
}
}
/*
* 检查移动文件是否成功
*/
private function checkMoving(){
//step 4:改名、指定新路径
$this->filename=$this->tempNewFileName.rand(100, 999).'.'.$this->filetype;
$this->filenames[]=$this->filename;
$this->filepath=rtrim($this->filepath,'/').'/';
//step 5:移动
//特别注意:这里必须指明新文件名,否则将无法移动,暂不知什么原因
if(is_uploaded_file($this->tempFileName)){
if(!move_uploaded_file($this->tempFileName, $this->filepath.$this->filename)){
$this->errorNum=-4;
return false;
}
}else{
$this->errorNum=-5;
return false;
}
return true;
}
/*
* getClassVarName():获取成员变量名
*/
private function getClassVarName(){
$tempArr=get_class_vars(get_class($this));
$arr=array();
foreach ($tempArr as $k=>$value){
$arr[]=$k;
}
return $arr;
}
/*
* 获取单个$_FILES传递的属性值
*/
private function getFilesAttr(){
$this->errorNum=$_FILES[$this->fieldname]['error'];
$this->originalFileName=$_FILES[$this->fieldname]['name'];
if($this->errorNum){
return false;
}else{
$this->fileSize=$_FILES[$this->fieldname]['size'];
$this->tempFileName=$_FILES[$this->fieldname]['tmp_name'];
return true;
}
}
/*
* 获取多个$_FILES传递的属性值
*/
private function getMultipleFilesAttr($error,$name,$fileSize,$tempFileName){
$this->errorNum=$error;
$this->originalFileName=$name;
if($this->errorNum){
return false;
}else{
$this->fileSize=$fileSize;
$this->tempFileName=$tempFileName;
return true;
}
}
/*
* 获取错误信息
*/
private function getError(){
$str='上传文件<font color="red">'.$this->originalFileName.'</font>时出错,';
switch ($this->errorNum) {
case 1:
$str.= "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值<br>";
break;
case 2:
$str.= "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
break;
case 3:
$str.= "文件只有部分被上传";
break;
case 4:
$str.= "没有文件被上传";
break;
case -1:
$str.= '必须指定上传路径!';
break;
case -2:
$str.= '文件类型不支持!';
break;
case -3:
$str.= '上传的文件太大,不要超过'.$this->maxsize.'';
break;
case -4:
$str.= '上传失败,没有权限上传文件!';
break;
case -5:
$str.='这不是一个上传文件!';
break;
default:
$str.= '未知错误';
break;
}
return $str;
}
/*
* 传递错误消息用于外部调用
*/
function getMessageError($type){
if($type){
return $this->messageError;
}else{
return $this->messageErrors;
}
}
/*
* 传递新文件名用于外部调用
*/
function getFileName($type){
if($type){
return $this->filename;
}else{
return $this->filenames;
}
}
/*
* 传递路径用于外部调用
*/
function getFilePath(){
return $this->filepath;
}
}
?>
二、文件上传表单
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title> File Uploads </title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<input type="file" name="pic"> <br>
<input type="submit" name="sub" value="上传">
</form>
</body>
</html>
三、文件上传处理
<?php
header('Content-Type:text/html;charset=utf8');
//注:$_FILES是全局变量,因此无需传递,便可到处使用!
/* 第一步:自定义上传设置
* 用户可自定义的设置: 只能使用如下的属性名(不区分大小写)
* 'fieldname' => '表单字段名'
* 'filename', => '上传后的文件名'
* 'filepath', => '上传文件路径'
* '$maxsize', => '上传文件大小的最大值'
* 'allowtype' => '允许上传文件的类型'
* 拓展:这个数组可以保存为一个配置文件
*/
$arr=array(
'filename' => date('Y').date('m').date('d').date('H').date('i').date('s'),
'fieldname' => 'pic'
);
//第二步:实例化上传类
require 'uploadFile.class.php';
$up =new uploadFile($arr);
//上传图片
if(!is_array($_FILES['pic']['name'])){//上传单张图片
if($up->uploadSingleFile()){
//获取上传后的新文件名,用于插入到数据库当中
echo $up->getFileName(1);
}else{
$messageError = $up->getMessageError(1);
echo $messageError;
}
}else{//上传多张图片:必须同时上传成功
if($up->uploadMultipleFile()){
print_r($up->getFileName(0));
}else{
print_r($up->getMessageError(0));
}
}
声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者码上甄选所有,原文出处。若您的权利被侵害,请联系删除。
本文标题:(php上传文件显示图片)(php上传文件显示图片不完整)
本文链接:https://www.51qsb.cn/article/m9dpq.html