PHP文件上传(1)

表单的写法

<html>
<head>
    <title>upload html</title>
</head>
<body>
    <form action='doAction1.php' method='post' enctype='multipart/form-data'>
        Please select the file you want to upload
    <input type='file' name='myFile'>
    <input type='submit' value='upload file'> 
    </form>
</form>
</body>
</html>

upload 的几个全局变量

这是总的_FILES[‘myFile’];
- filename= fileInfo[‘name’];
- type= fileInfo[‘type’];
- tmpname= fileInfo[‘tmp_name’];
- size= fileInfo[‘size’];
- error= fileInfo[‘error’];
所以相应的上传了之后print_r[‘_FILES’];可以看到

Array
(
    [myFile] => Array
        (
            [name] => contents.xml
            [type] => text/xml
            [tmp_name] => /Applications/MAMP/tmp/php/phpHKjygu
            [error] => 0
            [size] => 28210
        )

)

判断是否产生错误

$error==UPLOAD_ERR_OK

error对应的错误

        case 1:
            echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
            break;
        case 2:
            echo '超过了表单MAX_FILE_SIZE限制的大小';
            break;
        case 3:
            echo '文件部分被上传';
            break;
        case 4:
            echo '没有选择上传文件';
            break;
        case 6:
            echo '没有找到临时目录';
            break;
        case 7:
        case 8:
            echo '系统错误';
            break;

其实PHP中也定义了各种错误:

UPLOAD_ERR_OK //0
UPLOAD_ERR_INI_SIZE //1
UPLOAD_ERR_FROM_SIZE //2
UPLOAD_ERR_PARTIAL //3
UPLOAD_ERR_NO_FILE //4
UPLOAD_ERR_NO_TMP_DIR //5
UPLOAD_ERR_CANT_WRITE //7
UPLOAD_ERR_EXTENSION //8
判断文件类型是否合法

我们可以定义相应的文件类型和合法的最大的文件大小。

$maxSize=1024;
$allowExt=array('jpg','bmp','png','gif','wimp');

获得文件的后缀来判断文件的类型

<?php 
    $path_parts=pathinfo('./doAction.php');
    echo $path_parts['dirname']."<br>";
    echo $path_parts['basename']."<br>";
    echo $path_parts['extension']."<br>";
    echo $path_parts['filename']."<br>"; 
 ?>
if(in_array($ext,$allowext));
    ...

在这里为了避免出现后缀是”JPG”类似的大写的情况,我们可以使用strtolower()函数.

pathinfo()函数原型
mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )

其实这个函数只是对字符串进行了相应的处理而已

安全性的分析
bool is_uploaded_file ( string $filename )

判断是否是通过http post方法上传上来的

判断是否是图片文件

<?php 
    if(getimagesize('./false.jpg'))
        echo'True';
    else
        echo'False';
 ?>

这里getimagesize不仅仅判断了后缀名。函数原型如下

array getimagesize ( string $filename [, array &$imageinfo ] )
移动文件

如果没有将上传的文件移走的话是默认会放在tmp文件夹的,移动文件的话要用到函数move_uploaded_file

bool move_uploaded_file ( string $filename , string $destination )

为了避免重名我们可以对文件进行重命名

用md5(uniqid(microtime(true),true)).'.'.$ext;
//microtime(true)返回一个floag

比如说默认$path='uploads'但是file_exists ($path)所以

mkdir($path,0777,true);//允许递归地创建,类似于mkdir -p
chmod($path,0777);//修改权限

函数封装

避免重复地使用,将上传封装成为一个函数

<?php 
    function UploadFile($fileinfo,$path="myupload",$allowExt=array('jpg','bmp','png','gif','wimp'),$maxSize=2097152){
        $error=$fileinfo['error'];
        $filename=$fileinfo['name'];
        $tmpname=$fileinfo['tmp_name'];
        $size=$fileinfo['size'];

        if($error==UPLOAD_ERR_OK){
            if(!is_uploaded_file($tmpname))
                die("不是上传上来的");
            $ext=pathinfo($filename,PATHINFO_EXTENSION);
            if(!in_array($ext, $allowExt))
                die("文件类型不被允许");
            if(!getimagesize($tmpname))
                die("不是图片文件");
            if($size>$maxSize)
                die("文件过大");
            //接下来说明文件是图片文件

            $newfilename=md5(uniqid(microtime(True),True)).'.'.$ext;
            $destination=$path.'/'.$newfilename;

            //判断文件路径是否存在
            if(!file_exists($path)){
                mkdir($path,0777,True);
                chmod($path,0777);
            }
            if(move_uploaded_file($tmpname,$destination)){
                echo "upload successfully";
            }
            else{
                echo "Unexpected Error";
            }
        }
        else switch ($error) {
            case UPLOAD_ERR_INI_SIZE:
                echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';//$error=1
                break;
            case UPLOAD_ERR_FROM_SIZE :
                echo '超过了表单MAX_FILE_SIZE限制的大小';//$error=2
                break;
            case UPLOAD_ERR_PARTIAL:
                echo '文件部分被上传';//$error=3
                break;
            case UPLOAD_ERR_NO_FILE:
                echo '没有选择上传文件';//$error=4
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                break;//$error=5;
            case UPLOAD_ERR_CANT_WRITE:
                echo '没有找到临时目录';
                break;//$error=7;
            case UPLOAD_ERR_EXTENSION :
                echo '系统错误';
                break;//$error=8
        }
    }
 ?>

使用时

include_once 'upload.func.php';
$fileInfo=$_FILES['myFile'];
$allowExt=array('jpeg','jpg','png','gif','html','txt');
$newName=uploadFile($fileInfo,'uploads',false,$allowExt);
echo

多文件上传

表单
<html>
<head>
    <title></title>
</head>
<body>
    <form action="doAction.php" method="post" enctype="multitype/form-data">
        <input type="file" name='myFile[]'><br>
        <input type="file" name='myFile[]'><br>
        <input type="file" name='myFile[]'><br>
    </form>
    <input type="submit" value="upload"> 
</body>
</html>
//doAciton.php
<?php 
header('content-type:text/html;charset=utf-8');
include_once 'upload.func.php';
foreach($_FILES as $fileInfo){
    $files[]=uploadFile($fileInfo);
}
print_r($files);

多文件上传成功之后print_r可以看到

Array
(
    [0] => ./uploads/afab76605954f58e97460aa97562bb6c.jpg
    [1] => ./uploads/b0b04dc7ebd69502df954eb74d15a4be.jpg
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值