>  기사  >  백엔드 개발  >  파일 업로드 및 다운로드 예제의 PHP 구현에 대한 자세한 설명

파일 업로드 및 다운로드 예제의 PHP 구현에 대한 자세한 설명

王林
王林앞으로
2019-08-28 17:29:543017검색

1. 업로드 원리 및 구성

1.1 원리

클라이언트 파일을 서버에 업로드한 후 서버측 파일(임시 파일)을 지정된 디렉터리로 이동합니다.

1.2 클라이언트 구성

필수: 양식 페이지(업로드 파일 선택);

구체적으로: 전송 방법은 POST, enctype="multipart/form-data" 추가 > 속성은 둘 다 필수입니다(단, 장점과 단점이 공존합니다. 여기서는 업로드 방법과 파일 업로드 후 호출 등도 제한됩니다. 이에 대해서는 나중에 논의하겠습니다. POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:
<input type="file" name="myFile" /><br/>
<input type="submit" value="上传"/>
</form>
<?php

?>
</body>
</html>

先是表单页面(请自动忽略前端问题。。。),关键就是form的属性;另外就是input 中用到了type="file"这一点(体现到php的强大的拓展等等)。

然后是doAction.php

<?php
//$_FILES:文件上传变量
//print_r($_FILES);
$filename=$_FILES[&#39;myFile&#39;][&#39;name&#39;];
$type=$_FILES[&#39;myFile&#39;][&#39;type&#39;];
$tmp_name=$_FILES[&#39;myFile&#39;][&#39;tmp_name&#39;];
$size=$_FILES[&#39;myFile&#39;][&#39;size&#39;];
$error=$_FILES[&#39;myFile&#39;][&#39;error&#39;];

//将服务器上的临时文件移动到指定位置
//方法一move_upload_file($tmp_name,$destination)
//move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错
//方法二copy($src,$des)
//以上两个函数都是成功返回真,否则返回false
//copy($tmp_name, "copies/".$filename);
//注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来
copy($tmp_name, "copies/".$filename);
move_uploaded_file($tmp_name, "uploads/".$filename);
//能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在

//另外,错误信息也是不一样的,遇到错误可以查看或者直接报告给用户
if ($error==0) {
    echo "上传成功!";
}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 5:
            echo "上传文件为0";
            break;
    }
}

先把print_r($_FILES)这个信息看一下

Array
(
    [myFile] => Array
        (
            [name] => 梁博_简历.doc
            [type] => application/msword
            [tmp_name] => D:\wamp\tmp\php1D78.tmp
            [error] => 0
            [size] => 75776
        )

)

所以得到的是个二维数组,该怎么用,都是基本的东西(其实我喜欢降维再用);

基本是一眼就懂的东西,不罗嗦,关键有两个:tmp_name临时文件名;error报错信息(代号,后面可以利用);

然后这里看一下doAction后面一部分,利用报错信息来反馈给用户,需要说明的是为什么报错,和报错信息是什么都

1.3 关于报错

--报错原因

基本上都是超过或者不符合服务器关于上传文件的配置,那么服务器端配置有哪些呢?

先考虑上传我们用了什么?POST,upload

所以在php.ini中找这么几项:

file_upload:On

upload_tmp_dir=——临时文件保存目录;

upload_max_filesize=2M

max_file_uploads=20——允许一次上传的最大文件数量(注意和上面那个的区别,有没有size,别乱想)

post_max_size=8M——post方式发送数据的最大值

其他相关配置

max_exectuion_time=-1——最大执行时间,避免程序不好占用服务器资源;

max_input_time=60

max_input_nesting_level=64——输入嵌套深度;

memory_limit=128M——最大单线程的独立内存使用量

总之都是有关资源的配置。

--错误号

UPLOAD_ERR_OK             值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE      值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE  值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL          值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE          值:4; 没有文件被上传。  

注意:这个错误信息是第一步上传的信息,也就是上传到临时文件夹的情况,而不是move或者copy的情况。 

二、上传相关限制

2.1 客户端限制

<form action="doAction2.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="101321" />
请选择您要上传的文件:
<input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/>
<input type="submit" value="上传"/>
</form>

这里用input的属性对上传文件的大小和类型进行了限制,但是个人感觉:一,html代码是“可见的”;二,常不起作用(没找到原因,但因为第一个我也想放弃它,知道就好。 

 2.2 服务器端限制

主要限制大小和类型,再有就是方式。

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
//接受文件,临时文件信息
$fileinfo=$_FILES["myFile"];//降维操作
$filename=$fileinfo["name"];
$tmp_name=$fileinfo["tmp_name"];
$size=$fileinfo["size"];
$error=$fileinfo["error"];
$type=$fileinfo["type"];

//服务器端设定限制
$maxsize=10485760;//10M,10*1024*1024
$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;);//允许上传的文件类型(拓展名
$ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名

//目的信息
$path="uploads";
if (!file_exists($path)) {   //当目录不存在,就创建目录
    mkdir($path,0777,true);
    chmod($path, 0777);
}
//$destination=$path."/".$filename;
//得到唯一的文件名!防止因为文件名相同而产生覆盖
$uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀


if ($error==0) {
    if ($size>$maxsize) {
        exit("上传文件过大!");
    }
    if (!in_array($ext, $allowExt)) {
        exit("非法文件类型");
    }
    if (!is_uploaded_file($tmp_name)) {
        exit("上传方式有误,请使用post方式");
    }
    if (@move_uploaded_file($tmp_name, $uniName)) {//@错误抑制符,不让用户看到警告
        echo "文件".$filename."上传成功!";
    }else{
        echo "文件".$filename."上传失败!";
    }
    //判断是否为真实图片(防止伪装成图片的病毒一类的
    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
        exit("不是真正的图片类型");
    }

}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 7:
            echo "没有临时文件夹";
            break;
    }
}

2.3 封装

函数

<?php
function uploadFile($fileInfo,$path,$allowExt,$maxSize){

$filename=$fileInfo["name"];
$tmp_name=$fileInfo["tmp_name"];
$size=$fileInfo["size"];
$error=$fileInfo["error"];
$type=$fileInfo["type"];

//服务器端设定限制

$ext=pathinfo($filename,PATHINFO_EXTENSION);

//目的信息
if (!file_exists($path)) {   
    mkdir($path,0777,true);
    chmod($path, 0777);
}
$uniName=md5(uniqid(microtime(true),true)).&#39;.&#39;.$ext;
$destination=$path."/".$uniName;


if ($error==0) {
    if ($size>$maxSize) {
        exit("上传文件过大!");
    }
    if (!in_array($ext, $allowExt)) {
        exit("非法文件类型");
    }
    if (!is_uploaded_file($tmp_name)) {
        exit("上传方式有误,请使用post方式");
    }
    //判断是否为真实图片(防止伪装成图片的病毒一类的
    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
        exit("不是真正的图片类型");
    }
    if (@move_uploaded_file($tmp_name, $destination)) {//@错误抑制符,不让用户看到警告
        echo "文件".$filename."上传成功!";
    }else{
        echo "文件".$filename."上传失败!";
    }
    

}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 7:
            echo "没有临时文件夹";
            break;
    }
}
return $destination;
}

调用

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
$fileInfo=$_FILES["myFile"];
$maxSize=10485760;//10M,10*1024*1024
$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;tif&#39;);
$path="uploads";
include_once &#39;upFunc.php&#39;;
uploadFile($fileInfo, $path, $allowExt, $maxSize);

三、多文件的上传实现

3.1 利用单文件封装

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction5.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile1" /><br/>
请选择您要上传的文件:<input type="file" name="myFile2" /><br/>
请选择您要上传的文件:<input type="file" name="myFile3" /><br/>
请选择您要上传的文件:<input type="file" name="myFile4" /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
<?php
//print_r($_FILES);
header(&#39;content-type:text/html;charset=utf-8&#39;);
include_once &#39;upFunc.php&#39;;
foreach ($_FILES as $fileInfo){
    $file[]=uploadFile($fileInfo);
}

这里的思路,从print_r($_FILES)

function uploadFile($fileInfo,$path="uploads",$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;tif&#39;),$maxSize=10485760){

먼저 양식 페이지입니다(앞부분은 무시하세요) 자동으로 종료) 질문...), 핵심은 form의 속성입니다. 다른 하나는 type="file"을 사용하는 것입니다(PHP 등의 강력한 확장을 반영합니다.)

그럼 doAction.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction5.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>

먼저. code>print_r($_FILES) 이 정보를 보세요

Array
(
    [myFile] => Array
        (
            [name] => Array
                (
                    [0] => test32.png
                    [1] => test32.png
                    [2] => 333.png
                    [3] => test41.png
                )

            [type] => Array
                (
                    [0] => image/png
                    [1] => image/png
                    [2] => image/png
                    [3] => image/png
                )

            [tmp_name] => Array
                (
                    [0] => D:\wamp\tmp\php831C.tmp
                    [1] => D:\wamp\tmp\php834C.tmp
                    [2] => D:\wamp\tmp\php837C.tmp
                    [3] => D:\wamp\tmp\php83BB.tmp
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

            [size] => Array
                (
                    [0] => 46174
                    [1] => 46174
                    [2] => 34196
                    [3] => 38514
                )

        )

)

그래서 얻는 것은 2차원 배열입니다. 사용하는 방법은 모두 기본적인 것입니다(사실 저는 차원을 줄이고


기본적으로는 장황하지 않아도 알 수 있는 내용입니다. 두 가지 핵심 사항이 있습니다. tmp_name 임시 파일 이름 error 오류 메시지(code) 이름은 나중에 사용할 수 있습니다);

그럼 여기를 살펴보세요. doAction의 후반부는 오류 정보를 사용하여 사용자에게 피드백합니다. 1.3 오류가 보고되는 이유는 무엇입니까? 오류 보고에 대하여

--오류 보고의 이유


는 기본적으로 파일 업로드를 위한 구성, 서버 측 구성이 무엇입니까? POST, upload

그러면 php.ini에서 다음 항목을 찾으세요.

file_upload: On

upload_tmp_dir=——임시 파일 저장 디렉터리


upload_max_filesize=2M

max_file_uploads=20——한 번에 허용되는 최대 업로드 파일 수(위와 차이점을 참고하세요. 파일이 있으면 생각하지 마세요. size)

post_max_size=8M - post 모드에서 데이터를 보내는 최대값

기타 관련 구성

max_exectuion_time=-1——최대 실행 시간 프로그램이 서버 리소스를 점유하는 것을 방지합니다.

max_input_time=60max_input_nesting_level=64——입력 중첩 깊이

memory_limit=128M - 단일 스레드의 최대 독립 메모리 사용량🎜🎜간단히 말하면 리소스 구성에 관한 것입니다. 🎜🎜🎜--오류 번호🎜🎜🎜UPLOAD_ERR_OK 값: 0 오류가 발생하지 않았으며 파일이 성공적으로 업로드되었습니다. 🎜UPLOAD_ERR_INI_SIZE 값: 1; 업로드된 파일이 php.ini의 upload_max_filesize 옵션 제한을 초과합니다. 🎜UPLOAD_ERR_FORM_SIZE 값: 2; 업로드된 파일의 크기가 HTML 형식의 MAX_FILE_SIZE 옵션에 지정된 값을 초과합니다. 🎜UPLOAD_ERR_PARTIAL 값: 3 파일의 일부만 업로드되었습니다. 🎜UPLOAD_ERR_NO_FILE 값: 4 업로드된 파일이 없습니다. 🎜🎜🎜참고: 이 오류 메시지는 이동이나 복사할 때가 아닌 첫 번째 단계, 즉 임시 폴더에 업로드할 때 업로드된 정보입니다. 🎜🎜🎜🎜 2. 업로드 관련 제한 🎜🎜🎜2.1 클라이언트 제한 🎜
function getFiles(){
    $i=0;
    foreach($_FILES as $file){
        if(is_string($file[&#39;name&#39;])){  //单文件判定
            $files[$i]=$file;
            $i++;
        }elseif(is_array($file[&#39;name&#39;])){
            foreach($file[&#39;name&#39;] as $key=>$val){  //我的天,这个$key用的diao
                $files[$i][&#39;name&#39;]=$file[&#39;name&#39;][$key];
                $files[$i][&#39;type&#39;]=$file[&#39;type&#39;][$key];
                $files[$i][&#39;tmp_name&#39;]=$file[&#39;tmp_name&#39;][$key];
                $files[$i][&#39;error&#39;]=$file[&#39;error&#39;][$key];
                $files[$i][&#39;size&#39;]=$file[&#39;size&#39;][$key];
                $i++;
            }
        }
    }
    return $files;
    
}
🎜 입력 속성은 업로드되는 파일의 크기와 유형을 제한하는 데 사용되지만 개인적인 느낌은 다음과 같습니다. 1. html 코드가 "표시됩니다". . , 종종 작동하지 않습니다 (이유를 찾지 못했지만 첫 번째 때문에 나도 포기하고 싶습니다. 알아두면 좋습니다. 🎜🎜 2.2 서버 측 제한 🎜🎜 주로 크기 및 유형 제한 🎜
function uploadFile($fileInfo,$path=&#39;./uploads&#39;,$flag=true,$maxSize=1048576,$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;)){
    //$flag=true;
    //$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;gif&#39;,&#39;png&#39;);
    //$maxSize=1048576;//1M
    //判断错误号
    $res=array();
    if($fileInfo[&#39;error&#39;]===UPLOAD_ERR_OK){
        //检测上传得到小
        if($fileInfo[&#39;size&#39;]>$maxSize){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;上传文件过大&#39;;
        }
        $ext=getExt($fileInfo[&#39;name&#39;]);
        //检测上传文件的文件类型
        if(!in_array($ext,$allowExt)){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;非法文件类型&#39;;
        }
        //检测是否是真实的图片类型
        if($flag){
            if(!getimagesize($fileInfo[&#39;tmp_name&#39;])){
                $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;不是真实图片类型&#39;;
            }
        }
        //检测文件是否是通过HTTP POST上传上来的
        if(!is_uploaded_file($fileInfo[&#39;tmp_name&#39;])){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;文件不是通过HTTP POST方式上传上来的&#39;;
        }
        if($res) return $res;
        //$path=&#39;./uploads&#39;;
        if(!file_exists($path)){
            mkdir($path,0777,true);
            chmod($path,0777);
        }
        $uniName=getUniName();
        $destination=$path.&#39;/&#39;.$uniName.&#39;.&#39;.$ext;
        if(!move_uploaded_file($fileInfo[&#39;tmp_name&#39;],$destination)){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;文件移动失败&#39;;
        }
        $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;上传成功&#39;;
        $res[&#39;dest&#39;]=$destination;
        return $res;
        
    }else{
        //匹配错误信息
        switch ($fileInfo [&#39;error&#39;]) {
            case 1 :
                $res[&#39;mes&#39;] = &#39;上传文件超过了PHP配置文件中upload_max_filesize选项的值&#39;;
                break;
            case 2 :
                $res[&#39;mes&#39;] = &#39;超过了表单MAX_FILE_SIZE限制的大小&#39;;
                break;
            case 3 :
                $res[&#39;mes&#39;] = &#39;文件部分被上传&#39;;
                break;
            case 4 :
                $res[&#39;mes&#39;] = &#39;没有选择上传文件&#39;;
                break;
            case 6 :
                $res[&#39;mes&#39;] = &#39;没有找到临时目录&#39;;
                break;
            case 7 :
            case 8 :
                $res[&#39;mes&#39;] = &#39;系统错误&#39;;
                break;
        }
        return $res;
    }
}
🎜2.3 Encapsulation🎜 🎜Function🎜
function getExt($filename){
    return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
}

/**
 * 产生唯一字符串
 * @return string
 */
function getUniName(){
    return md5(uniqid(microtime(true),true));
}
🎜Call 🎜
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction6.php" method="POST" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile[]" multiple=&#39;multiple&#39; /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
🎜🎜3. 여러 파일 업로드 구현🎜🎜🎜3.1 단일 파일 캡슐화🎜
<?php 
//print_r($_FILES);
header("content-type:text/html;charset=utf-8");
require_once &#39;upFunc2.php&#39;;
require_once &#39;common.func.php&#39;;
$files=getFiles();
// print_r($files);
foreach($files as $fileInfo){
    $res=uploadFile($fileInfo);
    echo $res[&#39;mes&#39;],&#39;<br/>&#39;;
    $uploadFiles[]=@$res[&#39;dest&#39;];
}
$uploadFiles=array_values(array_filter($uploadFiles));
//print_r($uploadFiles);
<?php 
class upload{
    protected $fileName;
    protected $maxSize;
    protected $allowMime;
    protected $allowExt;
    protected $uploadPath;
    protected $imgFlag;
    protected $fileInfo;
    protected $error;
    protected $ext;
    /**
     * @param string $fileName
     * @param string $uploadPath
     * @param string $imgFlag
     * @param number $maxSize
     * @param array $allowExt
     * @param array $allowMime
     */
    public function __construct($fileName=&#39;myFile&#39;,$uploadPath=&#39;./uploads&#39;,$imgFlag=true,$maxSize=5242880,$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;),$allowMime=array(&#39;image/jpeg&#39;,&#39;image/png&#39;,&#39;image/gif&#39;)){
        $this->fileName=$fileName;
        $this->maxSize=$maxSize;
        $this->allowMime=$allowMime;
        $this->allowExt=$allowExt;
        $this->uploadPath=$uploadPath;
        $this->imgFlag=$imgFlag;
        $this->fileInfo=$_FILES[$this->fileName];
    }
    /**
     * 检测上传文件是否出错
     * @return boolean
     */
    protected function checkError(){
        if(!is_null($this->fileInfo)){
            if($this->fileInfo[&#39;error&#39;]>0){
                switch($this->fileInfo[&#39;error&#39;]){
                    case 1:
                        $this->error=&#39;超过了PHP配置文件中upload_max_filesize选项的值&#39;;
                        break;
                    case 2:
                        $this->error=&#39;超过了表单中MAX_FILE_SIZE设置的值&#39;;
                        break;
                    case 3:
                        $this->error=&#39;文件部分被上传&#39;;
                        break;
                    case 4:
                        $this->error=&#39;没有选择上传文件&#39;;
                        break;
                    case 6:
                        $this->error=&#39;没有找到临时目录&#39;;
                        break;
                    case 7:
                        $this->error=&#39;文件不可写&#39;;
                        break;
                    case 8:
                        $this->error=&#39;由于PHP的扩展程序中断文件上传&#39;;
                        break;
                        
                }
                return false;
            }else{
                return true;
            }
        }else{
            $this->error=&#39;文件上传出错&#39;;
            return false;
        }
    }
    /**
     * 检测上传文件的大小
     * @return boolean
     */
    protected function checkSize(){
        if($this->fileInfo[&#39;size&#39;]>$this->maxSize){
            $this->error=&#39;上传文件过大&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测扩展名
     * @return boolean
     */
    protected function checkExt(){
        $this->ext=strtolower(pathinfo($this->fileInfo[&#39;name&#39;],PATHINFO_EXTENSION));
        if(!in_array($this->ext,$this->allowExt)){
            $this->error=&#39;不允许的扩展名&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测文件的类型
     * @return boolean
     */
    protected function checkMime(){
        if(!in_array($this->fileInfo[&#39;type&#39;],$this->allowMime)){
            $this->error=&#39;不允许的文件类型&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测是否是真实图片
     * @return boolean
     */
    protected function checkTrueImg(){
        if($this->imgFlag){
            if(!@getimagesize($this->fileInfo[&#39;tmp_name&#39;])){
                $this->error=&#39;不是真实图片&#39;;
                return false;
            }
            return true;
        }
    }
    /**
     * 检测是否通过HTTP POST方式上传上来的
     * @return boolean
     */
    protected function checkHTTPPost(){
        if(!is_uploaded_file($this->fileInfo[&#39;tmp_name&#39;])){
            $this->error=&#39;文件不是通过HTTP POST方式上传上来的&#39;;
            return false;
        }
        return true;
    }
    /**
     *显示错误 
     */
    protected function showError(){
        exit(&#39;<span style="color:red">&#39;.$this->error.&#39;</span>&#39;);
    }
    /**
     * 检测目录不存在则创建
     */
    protected function checkUploadPath(){
        if(!file_exists($this->uploadPath)){
            mkdir($this->uploadPath,0777,true);
        }
    }
    /**
     * 产生唯一字符串
     * @return string
     */
    protected function getUniName(){
        return md5(uniqid(microtime(true),true));
    }
    /**
     * 上传文件
     * @return string
     */
    public function uploadFile(){
        if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){
            $this->checkUploadPath();
            $this->uniName=$this->getUniName();
            $this->destination=$this->uploadPath.&#39;/&#39;.$this->uniName.&#39;.&#39;.$this->ext;
            if(@move_uploaded_file($this->fileInfo[&#39;tmp_name&#39;], $this->destination)){
                return  $this->destination;
            }else{
                $this->error=&#39;文件移动失败&#39;;
                $this->showError();
            }
        }else{
            $this->showError();
        }
    }
}
🎜에서 아이디어를 찾을 수 있습니다. code>print_r($_FILES) 로 출력된 것을 보면 2차원 배열입니다. 그냥 트래버스해서 사용하면 됩니다! 기본값🎜
<?php 
header(&#39;content-type:text/html;charset=utf-8&#39;);
require_once &#39;upload.class.php&#39;;
$upload=new upload(&#39;myFile1&#39;,&#39;imooc&#39;);
$dest=$upload->uploadFile();
echo $dest;
🎜이 방법은 간단하지만 문제가 있습니다🎜 🎜정상적으로 4장의 사진을 업로드하는 데에는 문제가 없지만, 중간에 해당 기능의 종료가 활성화되면 즉시 중지되어 다른 사진이 발생합니다 🎜🎜3.2 업그레이드 버전 패키지🎜🎜🎜는 파일 업로드 캡슐화🎜🎜먼저 다음과 같은 정적 파일을 작성하세요.🎜
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<a href="1.rar">下载1.rar</a>
<br />
<a href="1.jpg">下载1.jpg</a>
<br />
<a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>
<br />
<a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a>
<?php

?>
</body>
</html>
🎜Print $_FILES🎜🎜
<?php 
$filename=$_GET[&#39;filename&#39;];
header(&#39;content-disposition:attachment;
filename=&#39;.basename($filename));
header(&#39;content-length:&#39;.filesize($filename));
readfile($filename);
🎜 3차원 배열을 얻습니다🎜🎜복잡하지만 복잡성이 규칙적이고 값이 모두 함께 있으므로 값을 얻는 것이 매우 편리합니다. 🎜🎜먼저 파일 정보를 얻으십시오! 정보를 처리하는 단일 파일로 변환합니다 🎜rrreee🎜 그런 다음 종료 오류를 변경하고 여기에서 res를 사용하세요🎜🎜rrreee 🎜두 개의 작은 🎜rrreee를 캡슐화합니다🎜그런 다음 정적에서 multiple 속성을 사용하여 여러 파일의 입력을 실현합니다 🎜 🎜rrreee🎜doAction6.php🎜🎜rrreee🎜 4. 객체지향 파일 업로드🎜rrreeerrreee🎜🎜 5. 다운로드🎜 🎜🎜
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<a href="1.rar">下载1.rar</a>
<br />
<a href="1.jpg">下载1.jpg</a>
<br />
<a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>
<br />
<a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a>
<?php

?>
</body>
</html>
<?php 
$filename=$_GET[&#39;filename&#39;];
header(&#39;content-disposition:attachment;
filename=&#39;.basename($filename));
header(&#39;content-length:&#39;.filesize($filename));
readfile($filename);

总结:

9cfee2c08e3b36362b847e716f967f68

3461085d236c9169c7da23952e5dff8c076402276aae5dbec7f672f8f4e5cc81

 二维数组的降维处理;

$_FILES变量

move_upload_file();copy();

tmp_name临时文件;

拓展名的提取;

真实图片的验证;

唯一文件名的生成;

函数封装以及调用;

利用单个文件函数实现多文件上传;

小功能的封装;

多文件的遍历;

面向对象的开发过程;

下载;

以上就是全部的讲解,希望可以帮助到大家,有错误的地方请指出。

更多相关问题请访问PHP中文网:PHP视频教程

위 내용은 파일 업로드 및 다운로드 예제의 PHP 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제