>백엔드 개발 >PHP 튜토리얼 >PHP에서 파일을 업로드하고 다운로드하는 방법

PHP에서 파일을 업로드하고 다운로드하는 방법

藏色散人
藏色散人앞으로
2019-11-19 13:48:483924검색

1장 파일 업로드

1.1 클라이언트 업로드 설정

파일 업로드는 B/S 프로그램에서 일반적인 기능이 되었습니다. 목적은 고객이 브라우저(Browser)를 통해 서버(Server)의 지정된 디렉터리에 파일을 업로드할 수 있도록 하는 것입니다.

파일 업로드를 지원하는 인터넷의 일반적인 웹사이트:

다양한 네트워크 디스크

아바타

온라인 사진 앨범

실명 인증

이메일 첨부 파일

간단히 말하면, 웹 개발에서는 사용자가 파일을 다음으로 전달해야 합니다. 서버는 모두 PHP의 업로드 범주에 속합니다. 서버는 이 기능을 수행하지 않는 한 복사본만 허용할 수 있습니다. 10086 고객 서비스와 마찬가지로 전화만 하면 수락합니다. 수락하지 않으면 서버가 바쁘다는 의미일 뿐입니다.

PHP 파일 업로드 기본 지식:

1) 클라이언트 양식 설정

2) 업로드된 파일을 운영하고 처리하는 서버

양식 양식 항목을 설정해야 함:

<html>
    <head><title>文件上传</title></head>
    <body>
        <form action="./upload.php"  method="post" enctype="multipart/form-data"><!--必须要写-->
            <!--typle写file类型,name必须要写,名字随便-->
            选择文件:<input type="file" name="myfile">
            <input type="submit" value="上传文件">
        </form>
    </body>
</html>

몇 가지 특징적인 속성에 주의하세요:

1. 파일은 반드시 post 방식으로 업로드해야 하며, get 방식은 사용할 수 없습니다.

2. 양식은 enctype="multipart/form-data"로 작성해야 합니다.

3. 이름은 입력란에 반드시 기재해주셔야 합니다.

1.2 업로드는 서버 측에서 PHP를 통해 처리됩니다.

업로드된 파일의 수신 및 처리는 PHP 스크립트를 통해 처리됩니다. 특히 다음 세 가지 정보 측면이 필요합니다.

1) PH 구성 파일에서 지침을 설정합니다. : 괜찮습니다. PHP의 파일 업로드 기능을 로컬에서 조정합니다.

2) $FILES 다차원 배열: 업로드된 파일과 관련된 다양한 정보를 저장하는 데 사용됩니다. 다른 데이터는 여전히 $_POST를 사용하여 가져옵니다.

3) PHP 파일 업로드 처리 기능: 업로드된 파일의 후속 처리에 사용됩니다.

1) PHP 구성 파일의 파일 업로드와 관련된 옵션입니다.

PHP에서 파일을 업로드하고 다운로드하는 방법

2) $_FILES 다차원 배열.

슈퍼 전역 배열 $_FILES

1. $_FILES["myfile"]["name"]의 값은 클라이언트 파일 시스템의 파일 이름입니다.

2. $FILES["myfile"]["type"]의 값은 클라이언트가 전달한 파일 유형입니다.

3. $_FILES["myfile"]["size"]의 값은 파일 크기(바이트)입니다.

4. $_FILES["myfile"]["tmp_name"]의 값은 파일이 업로드된 후 서버에 저장된 임시 전체 경로입니다.

5. $_FILES["myfile"]["error"]의 값은 파일 업로드의 오류 코드 - PHP 4.2 이후에 추가된 기능입니다.

파일 업로드 오류 코드 정보:

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이며 업로드된 파일이 없습니다.

UPLOAD_ERR_NO_TMP_DIR

값이 6이면 임시 폴더를 찾을 수 없습니다. PHP 4.3.10 및 PHP 5.0.3에서 도입되었습니다.

UPLOAD_ERR_CANT_WRITE

값은 7, 파일 쓰기에 실패했습니다. PHP 5.1.0에서 도입되었습니다.

참고: 위 값은 PHP 4.3.0 이후 PHP 상수가 되었습니다.

공통 데이터 형식(MIME)

PHP에서 파일을 업로드하고 다운로드하는 방법

3) PHP의 파일 업로드 처리 기능

성공적으로 업로드된 파일은 서버측 임시 디렉터리에 저장되며, 파일명은 임의로 생성된 파일명입니다. 임시 파일 이름 .

참고: 이 파일은 프로그램 실행 후 자동으로 삭제됩니다. 삭제하기 전에 로컬 파일처럼 작동할 수 있습니다.

파일 업로드 처리 기능:

is_uploaded_file - HTTP POST를 통해 파일이 업로드되는지 확인합니다.

형식: bool is_uploaded_file (string $filename)

move_uploaded_file — 업로드된 파일을 새 위치로 이동합니다.

형식: bool move_uploaded_file (string $filename, string $destination)

참고: 대상 파일이 이미 존재하는 경우 덮어쓰게 됩니다.

매개변수 설명: 파일의 임시 디렉터리, 이동할 위치 디렉터리

사례:

1) 프런트 엔드 업로드 인터페이스 설정

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="doup.php" method="post" enctype="multipart/form-data">
        <input type="file" name="pic">
        <input type="submit" value="上传">
    </form>
</body>
</html>

2) doup.php는 임시 디렉터리에 업로드된 파일을 처리합니다.

  //专业搬运工具
    //move_uploaded_file()
    //参数1: 文件临时目录  参数2: 要移动到的位置
    //is_uploaded_file() 判断文件是否是http post提交过来的
    //参数1: 文件临时目录
    //1.我们保存的路径按照时间来创建
    //var_dump($_GET);
    //1.1保存的路径
    $dir=&#39;./biran/&#39;.date(&#39;Y/m/d/&#39;);
    //echo $dir;exit;
    //1.2 判断文件上传的路径是否存在 如果不存在就创建
    if(!file_exists($dir)){
        mkdir($dir,777,true);
    }
    //2.要有个好的文件名 唯一的文件名
    //2.1获取文件的后缀名
    //2.jpg  jpg 
    $suffix = pathinfo($_FILES[&#39;pic&#39;][&#39;name&#39;],PATHINFO_EXTENSION);
    //echo $suffix;
    //2.2重新起名
    $filename = date(&#39;Ymd&#39;).uniqid().mt_rand(0,9999).&#39;.&#39;.$suffix;
    //echo $filename;
    //开始搬运
    //判断是否是http post 传递的文件
    if(!is_uploaded_file($_FILES[&#39;pic&#39;][&#39;tmp_name&#39;])){
        //不是http post上传文件
        echo &#39;别整没用的!!&#39;;exit;
    }
    //开始真正的搬运
    if(move_uploaded_file($_FILES[&#39;pic&#39;][&#39;tmp_name&#39;],$dir.$filename)){
        echo &#39;11111111111&#39;;
    }else{
        echo &#39;22222222222&#39;;
    }

함수로 캡슐화:

아이디어:

  function upload(){
        //1.判断文件上传错误
        //2.判断你文件上传的类型是否是你想要的类型
        //3.起名字
        //4.判断保存路径是否存在
        //5.判断是否是http post方式上传
        //6.移动图片
        //7.返回移动成功的图片名
    }

함수 캡슐화 시작: 새 function.php 만들기

<?php
    /*
        文件上传函数
        @param  string  $name  文件上传文件域的name值
        @param  string  $dir   文件保存路径
        @param  array   $allow 文件允许上传的类型
        return  string  $filename 文件名  如果失败 返回false
     */
    function upload($name,$dir=&#39;./upload/&#39;,$allow=array(&#39;jpg&#39;,&#39;gif&#39;,&#39;jpeg&#39;,&#39;png&#39;)){
        //echo $name;exit;
        //var_dump($_FILES);exit;
        //1.判断文件上传错误
        if($_FILES[$name][&#39;error&#39;]>0){
            //echo &#39;上传错误&#39;;
            switch($_FILES[$name][&#39;error&#39;]){
                case 1:
                    echo &#39;上传的文件超过了 php.ini 中upload_max_filesize 选项限制的值.&#39;;
                    break;
                case 2:
                    echo &#39;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值&#39;;
                    break;
                case 3:
                    echo &#39;文件只有部分被上传.&#39;;
                    break;
                case 4:
                    echo &#39;没有文件被上传.&#39;;
                    break;
                case 6:
                    echo &#39;找不到临时文件夹.&#39;;
                    break;
                case 7:
                    echo &#39;文件写入失败.&#39;;
                    break;
            }
            return false;
        }
        //2.判断你文件上传的类型是否是你想要的类型
        //2.1允许上传的类型
        //2.2 获取后缀名
        $suffix = pathinfo($_FILES[$name][&#39;name&#39;],PATHINFO_EXTENSION);
        //echo $suffix;exit;
        //2.3 判断是否是我们允许上传的类型
        //var_dump(in_array($suffix,$allow));exit;
        if(!in_array($suffix,$allow)){
            //不允许上传的类型
            echo  &#39;大哥你的上传类型不符合&#39;;
            return false;
        }
        //3.起名字
        $filename = date(&#39;Ymd&#39;).uniqid().mt_rand(0,9999).&#39;.&#39;.$suffix;
        //echo $filename;exit;
        //4.判断保存路径是否存在
        //4.1 得到保存路径
        //4.2 处理保存路径和后面的斜杠
        $save_path = rtrim($dir,&#39;/&#39;);
        $save_path .=&#39;/&#39;;
        //4.3 保存路径中的时间文件夹处理
        $save_path .=date(&#39;Y/m/d/&#39;);
        //4.4 判断保存的路径是否存在
        if(!file_exists($save_path)){
            mkdir($save_path,777,true);
        }
        //4.5 拼接一个完整的保存路径
        $path = $save_path.$filename;
        //echo $path;exit;
        //5.判断是否是httppost方式上传
        if(!is_uploaded_file($_FILES[$name][&#39;tmp_name&#39;])){
            echo &#39;滚蛋!&#39;;
            return false;
        }
        //6.移动图片
        if(!move_uploaded_file($_FILES[$name][&#39;tmp_name&#39;],$path)){
            echo &#39;移动失败&#39;;
            return false;
        }
        //7.返回移动成功的图片名
        return $filename;
    }

함수를 호출하여 업로드 시작:

<?php
    include &#39;./function.php&#39;;
    //var_dump($_FILES);exit;
    echo upload(&#39;file&#39;,&#39;./leiding&#39;,array(&#39;jpg&#39;,&#39;png&#39;));

2장 다중 파일 업로드

2.1 다중 파일 업로드 이름이 다릅니다

여러 파일을 업로드해야 하는 경우 이 경우 해결 방법은 두 가지입니다.

1) 다른 양식 요소를 사용하세요.

<input type="file" name="file_a">
<input type="file" name="file_b">
<input type="file" name="file_c">

2) 양식 요소를 배열 형식으로 사용하세요.

<input type="file" name="file[]">
<input type="file" name="file[]">
<input type="file" name="file[]">

3장 파일 다운로드

1) 브라우저에서 인식되지 않는 파일은 연결을 통해 직접 다운로드할 수 있습니다.

  <!-- 因为他们三个浏览器不认识这样的类型 -->
    <a href="./downlist/1.rar">1.rar</a>
    <a href="./downlist/1.exe">1.exe</a>
    <a href="./downlist/1.avi">1.avi</a>

2) 对于浏览器不识别的,可以利用 readfile 函数。

  <!-- 浏览器认识这样的类型,就会被解析 -->
    <a href="./action.php?name=1.html">1.html</a>
    <a href="./action.php?name=1.php">1.php</a>
    <a href="./action.php?name=1.txt">1.txt</a>
    <a href="./action.php?name=1.jpg">1.jpg</a>
//接收一下name值.
$name = $_GET[&#39;name&#39;];
//实现下载功能
//强制浏览器弹出另存为对话框
header(&#39;content-Disposition:attachment;filename="&#39;.$name.&#39;"&#39;);
//此时只是下载了一个空文件,需要利用readfile读一遍所有的内容.便可下载.
$path = &#39;./downlist/&#39;.$name;
readfile($path);

위 내용은 PHP에서 파일을 업로드하고 다운로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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