php文件上傳與下載(附封裝好的函數文件)

来源:https://www.cnblogs.com/chenyingying0/archive/2020/01/13/12189088.html

單文件上傳前端頁面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Upload A File</title> </head> <body> <form action="upload.php" method= ...


單文件上傳
前端頁面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Upload A File</title>
    </head>
    <body>
        <form action="upload.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="1024000" />
            <input type="file" name="test_pic" />
            <input type="submit" value="上傳" />
        </form>
    </body>
    </html>

後端實現upload.php

    <?php
    /**
     * Created by PhpStorm.
     * Date: 2018/11/11
     * Time: 14:06
     */

    // 接收$_FILES數組
    $key = 'test_pic';
    $mimeWhiteList = ['image/jpeg', 'image/png', 'image/gif'];//文件映射白名單
    $extWhiteList = ['jpeg', 'jpg', 'png', 'gif'];//文件擴展名白名單
    $allowSize = 2*1024*1024;
    $destDir = './uploads';

    $name = $_FILES[$key]['name']; // 源文件名稱
    $type = $_FILES[$key]['type']; // MIME 類型
    $tmpName = $_FILES[$key]['tmp_name']; // 臨時文件名稱
    $error = $_FILES[$key]['error']; // 錯誤信息
    $size = $_FILES[$key]['size']; // 文件大小 位元組

    // 處理錯誤
    // 0 - 無錯誤
    if ($error > UPLOAD_ERR_OK) {
        switch($error) {
            // 1 - 文件大小超出了php.ini當中的upload_max_filesize的大小
            case UPLOAD_ERR_INI_SIZE:
                exit('文件大小超出了php.ini當中的upload_max_filesize的大小');
            // 2 - 超出表單當中的MAX_FILE_SIZE的大小
            case UPLOAD_ERR_FORM_SIZE:
                exit('超出表單當中的MAX_FILE_SIZE的大小');
            // 3 - 部分文件被上傳
            case UPLOAD_ERR_PARTIAL:
                exit('部分文件被上傳');
            // 4 - 沒有文件被上傳
            case UPLOAD_ERR_NO_FILE:
                exit('沒有文件被上傳');
            // 6 - 臨時目錄不存在
            case UPLOAD_ERR_NO_TMP_DIR:
                exit('臨時目錄不存在');
            // 7 - 磁碟寫入失敗
            case UPLOAD_ERR_CANT_WRITE:
                exit('磁碟寫入失敗');
            // 8 - 文件上傳被PHP擴展阻止
            case UPLOAD_ERR_EXTENSION:
                exit('文件上傳被PHP擴展阻止');
            default:
                exit('未知錯誤');
        }
    }

    // 限制文件的MIME
    if (!in_array($type, $mimeWhiteList)) {
        exit('文件類型' . $type . '不被允許!');
    }

    // 限制文件的擴展名
    $ext = pathinfo($name, PATHINFO_EXTENSION);
    if (!in_array($ext, $extWhiteList)) {
        exit('文件擴展名' . $ext . '不被允許!');
    }

    // 限制文件大小
    if ($size > $allowSize) {
        exit('文件大小 ' . $size . ' 超出限定大小 ' . $allowSize . ' !');
    }

    // 生成新的隨機文件名稱
    // md5(rand());
    $fileName = uniqid() . '.' . $ext;

    // 移動臨時文件到指定目錄當中並重新命名文件名
    if (!file_exists($destDir)) {
        mkdir($destDir, 0777, true);
    }
    if (is_uploaded_file($tmpName) && move_uploaded_file($tmpName, $destDir . '/' . $fileName)) {
        echo "恭喜,文件上傳成功";
    } else {
        echo "很抱歉,文件上傳失敗";
    }

多文件上傳,指定文件數量
前端頁面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Upload Multiple Files</title>
    </head>
    <body>
    <form action="multiple_upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="1024000" />
        <input type="file" name="test_pic1" />
        <input type="file" name="test_pic2" />
        <input type="file" name="test_pic3" />
        <input type="submit" value="上傳" />
    </form>
    </body>
    </html>

後端實現multiple_upload.php

    <?php
    /**
     * Created by PhpStorm.
     * Date: 2018/11/11
     * Time: 14:54
     */

    $errors = [];
    $mimeWhiteList = ['image/jpeg', 'image/png', 'image/gif'];
    $extWhiteList = ['jpeg', 'jpg', 'png', 'gif'];
    $allowSize = 2*1024*1024;
    $destDir = './uploads';

    foreach($_FILES as $key => $val) {
        // name type tmp_name error size
        // 接收$_FILES
        $name = $_FILES[$key]['name']; // 源文件名稱
        $type = $_FILES[$key]['type']; // MIME 類型
        $tmpName = $_FILES[$key]['tmp_name']; // 臨時文件名稱
        $error = $_FILES[$key]['error']; // 錯誤信息
        $size = $_FILES[$key]['size']; // 文件大小 位元組

        // 處理錯誤
        // 0 - 無錯誤
        if ($error > UPLOAD_ERR_OK) {
            switch($error) {
                // 1 - 文件大小超出了php.ini當中的upload_max_filesize的大小
                case UPLOAD_ERR_INI_SIZE:
                    $errors[$key] = '文件大小超出了php.ini當中的upload_max_filesize的大小';
                    continue 2;
                // 2 - 超出表單當中的MAX_FILE_SIZE的大小
                case UPLOAD_ERR_FORM_SIZE:
                    $errors[$key] = '超出表單當中的MAX_FILE_SIZE的大小';
                    continue 2;
                // 3 - 部分文件被上傳
                case UPLOAD_ERR_PARTIAL:
                    $errors[$key] = '部分文件被上傳';
                    continue 2;
                // 4 - 沒有文件被上傳
                case UPLOAD_ERR_NO_FILE:
                    $errors[$key] = '沒有文件被上傳';
                    continue 2;
                // 6 - 臨時目錄不存在
                case UPLOAD_ERR_NO_TMP_DIR:
                    $errors[$key] = '臨時目錄不存在';
                    continue 2;
                // 7 - 磁碟寫入失敗
                case UPLOAD_ERR_CANT_WRITE:
                    $errors[$key] = '磁碟寫入失敗';
                    continue 2;
                // 8 - 文件上傳被PHP擴展阻止
                case UPLOAD_ERR_EXTENSION:
                    $errors[$key] = '文件上傳被PHP擴展阻止';
                    continue 2;
                default:
                    $errors[$key] = '未知錯誤';
                    continue 2;
            }
        }

        // 限制MIME
        if (!in_array($type, $mimeWhiteList)) {
            $errors[$key] = '文件類型' . $type . '不被允許!';
            continue;
        }

        // 限制擴展名
        $ext = pathinfo($name, PATHINFO_EXTENSION);
        if (!in_array($ext, $extWhiteList)) {
            $errors[$key] = '文件擴展名' . $ext . '不被允許!';
            continue;
        }

        // 限制大小
        if ($size > $allowSize) {
            $errors[$key] = '文件大小 ' . $size . ' 超出限定大小 ' . $allowSize . ' !';
            continue;
        }

        // 生成隨機文件名稱
        $fileName = uniqid() . '.' . $ext;

        // 移動文件
        if (!file_exists($destDir)) {
            mkdir($destDir, 0777, true);
        }
        if (!is_uploaded_file($tmpName) || !move_uploaded_file($tmpName, $destDir . '/' . $fileName)) {
            $errors[$key] = "很抱歉,文件上傳失敗";
            continue;
        }
    }

    if (count($errors) > 0) {
        var_dump($errors);
    } else {
        echo "文件全部上傳成功";
    }

多文件上傳,不定文件數量
前端頁面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Upload Multiple Files</title>
    </head>
    <body>
    <form action="multiple_upload2.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="6024000" />
        <input type="file" name="test_pic[]" />
        <input type="file" name="test_pic[]" />
        <input type="file" name="test_pic[]" />
        <input type="submit" value="上傳" />
    </form>
    </body>
    </html>

後端實現multiple_upload2.php

    <?php
    /**
     * Created by PhpStorm.
     * Date: 2018/11/11
     * Time: 15:12
     */

    $key = 'test_pic';
    $mimeWhiteList = ['image/jpeg', 'image/png', 'image/gif'];
    $extWhiteList = ['jpeg', 'jpg', 'png', 'gif'];
    $allowSize = 2*1024*1024;
    $destDir = './uploads';

    // 接收和處理$_FILES
    if (!empty($_FILES[$key])) {
        $files = [];
        foreach($_FILES[$key]['name'] as $k => $v) {
            $files[$k]['name'] = $v;
            $files[$k]['type'] = $_FILES[$key]['type'][$k];
            $files[$k]['tmp_name'] = $_FILES[$key]['tmp_name'][$k];
            $files[$k]['error'] = $_FILES[$key]['error'][$k];
            $files[$k]['size'] = $_FILES[$key]['size'][$k];
        }
    }

    $errors = [];
    foreach($files as $file) {
        // name type error size
        $name = $file['name']; // 源文件名稱
        $type = $file['type']; // MIME 類型
        $tmpName = $file['tmp_name']; // 臨時文件名稱
        $error = $file['error']; // 錯誤信息
        $size = $file['size']; // 文件大小 位元組

        // 處理錯誤
        // 0 - 無錯誤
        if ($error > UPLOAD_ERR_OK) {
            switch($error) {
                // 1 - 文件大小超出了php.ini當中的upload_max_filesize的大小
                case UPLOAD_ERR_INI_SIZE:
                    $errors[$key] = $name . '文件大小超出了php.ini當中的upload_max_filesize的大小';
                    continue 2;
                // 2 - 超出表單當中的MAX_FILE_SIZE的大小
                case UPLOAD_ERR_FORM_SIZE:
                    $errors[$key] =  $name . '超出表單當中的MAX_FILE_SIZE的大小';
                    continue 2;
                // 3 - 部分文件被上傳
                case UPLOAD_ERR_PARTIAL:
                    $errors[$key] = $name . '部分文件被上傳';
                    continue 2;
                // 4 - 沒有文件被上傳
                case UPLOAD_ERR_NO_FILE:
                    $errors[$key] = $name . '沒有文件被上傳';
                    continue 2;
                // 6 - 臨時目錄不存在
                case UPLOAD_ERR_NO_TMP_DIR:
                    $errors[$key] = $name . '臨時目錄不存在';
                    continue 2;
                // 7 - 磁碟寫入失敗
                case UPLOAD_ERR_CANT_WRITE:
                    $errors[$key] = $name . '磁碟寫入失敗';
                    continue 2;
                // 8 - 文件上傳被PHP擴展阻止
                case UPLOAD_ERR_EXTENSION:
                    $errors[$key] = $name . '文件上傳被PHP擴展阻止';
                    continue 2;
                default:
                    $errors[$key] = $name . '未知錯誤';
                    continue 2;
            }
        }

        // 限制MIME類型
        if (!in_array($type, $mimeWhiteList)) {
            $errors[$key] = '文件類型' . $type . '不被允許!';
            continue;
        }

        // 限制擴展名
        $ext = pathinfo($name, PATHINFO_EXTENSION);
        if (!in_array($ext, $extWhiteList)) {
            $errors[$key] = '文件擴展名' . $ext . '不被允許!';
            continue;
        }

        // 限制文件大小
        if ($size > $allowSize) {
            $errors[$key] = '文件大小 ' . $size . ' 超出限定大小 ' . $allowSize . ' !';
            continue;
        }

        // 生成隨機文件名稱
        $fileName = uniqid() . '.' . $ext;

        // 移動文件
        if (!file_exists($destDir)) {
            mkdir($destDir, 0777, true);
        }
        if (!is_uploaded_file($tmpName) || !move_uploaded_file($tmpName, $destDir . '/' . $fileName)) {
            $errors[$key] = "很抱歉,文件上傳失敗";
            continue;
        }
    }

    if (count($errors) > 0) {
        var_dump($errors);
    } else {
        echo "文件全部上傳成功";
    }

文件上傳類封裝 UploadFile.php
支持多文件或者單文件

    <?php
    /**
     * Created by PhpStorm.
     * Date: 2018/11/11
     * Time: 22:01
     */

    class UploadFile
    {

        /**
         *
         */
        const UPLOAD_ERROR = [
            UPLOAD_ERR_INI_SIZE => '文件大小超出了php.ini當中的upload_max_filesize的值',
            UPLOAD_ERR_FORM_SIZE => '文件大小超出了MAX_FILE_SIZE的值',
            UPLOAD_ERR_PARTIAL => '文件只有部分被上傳',
            UPLOAD_ERR_NO_FILE => '沒有文件被上傳',
            UPLOAD_ERR_NO_TMP_DIR => '找不到臨時目錄',
            UPLOAD_ERR_CANT_WRITE => '寫入磁碟失敗',
            UPLOAD_ERR_EXTENSION => '文件上傳被擴展阻止',
        ];

        /**
         * @var
         */
        protected $field_name;

        /**
         * @var string
         */
        protected $destination_dir;

        /**
         * @var array
         */
        protected $allow_mime;

        /**
         * @var array
         */
        protected $allow_ext;

        /**
         * @var
         */
        protected $file_org_name;

        /**
         * @var
         */
        protected $file_type;

        /**
         * @var
         */
        protected $file_tmp_name;

        /**
         * @var
         */
        protected $file_error;

        /**
         * @var
         */
        protected $file_size;

        /**
         * @var array
         */
        protected $errors;

        /**
         * @var
         */
        protected $extension;

        /**
         * @var
         */
        protected $file_new_name;

        /**
         * @var float|int
         */
        protected $allow_size;

        /**
         * UploadFile constructor.
         * @param $keyName
         * @param string $destinationDir
         * @param array $allowMime
         * @param array $allowExt
         * @param float|int $allowSize
         */
        public function __construct($keyName, $destinationDir = './uploads', $allowMime = ['image/jpeg', 'image/gif'], $allowExt = ['gif', 'jpeg'], $allowSize = 2*1024*1024)
        {
            $this->field_name = $keyName;
            $this->destination_dir = $destinationDir;
            $this->allow_mime = $allowMime;
            $this->allow_ext = $allowExt;
            $this->allow_size = $allowSize;
        }

        /**
         * @param $destinationDir
         */
        public function setDestinationDir($destinationDir)
        {
            $this->destination_dir = $destinationDir;
        }

        /**
         * @param $allowMime
         */
        public function setAllowMime($allowMime)
        {
            $this->allow_mime = $allowMime;
        }

        /**
         * @param $allowExt
         */
        public function setAllowExt($allowExt)
        {
            $this->allow_ext = $allowExt;
        }

        /**
         * @param $allowSize
         */
        public function setAllowSize($allowSize)
        {
            $this->allow_size = $allowSize;
        }

        /**
         * @return bool
         */
        public function upload()
        {
            // 判斷是否為多文件上傳
            $files = [];
            if (is_array($_FILES[$this->field_name]['name'])) {
                foreach($_FILES[$this->field_name]['name'] as $k => $v) {
                    $files[$k]['name'] = $v;
                    $files[$k]['type'] = $_FILES[$this->field_name]['type'][$k];
                    $files[$k]['tmp_name'] = $_FILES[$this->field_name]['tmp_name'][$k];
                    $files[$k]['error'] = $_FILES[$this->field_name]['error'][$k];
                    $files[$k]['size'] = $_FILES[$this->field_name]['size'][$k];
                }
            } else {
                $files[] = $_FILES[$this->field_name];
            }

            foreach($files as $key => $file) {
                // 接收$_FILES參數
                $this->setFileInfo($key, $file);

                // 檢查錯誤
                $this->checkError($key);

                // 檢查MIME類型
                $this->checkMime($key);

                // 檢查擴展名
                $this->checkExt($key);

                // 檢查文件大小
                $this->checkSize($key);

                // 生成新的文件名稱
                $this->generateNewName($key);

                if (count((array)$this->getError($key)) > 0) {
                    continue;
                }
                // 移動文件
                $this->moveFile($key);
            }
            if (count((array)$this->errors) > 0) {
                return false;
            }
            return true;
        }

        /**
         * @return array
         */
        public function getErrors()
        {
            return $this->errors;
        }

        /**
         * @param $key
         * @return mixed
         */
        protected function getError($key)
        {
            return $this->errors[$key];
        }

        /**
         *
         */
        protected function setFileInfo($key, $file)
        {
            // $_FILES  name type temp_name error size
            $this->file_org_name[$key] = $file['name'];
            $this->file_type[$key] = $file['type'];
            $this->file_tmp_name[$key] = $file['tmp_name'];
            $this->file_error[$key] = $file['error'];
            $this->file_size[$key] = $file['size'];
        }


        /**
         * @param $key
         * @param $error
         */
        protected function setError($key, $error)
        {
            $this->errors[$key][] = $error;
        }


        /**
         * @param $key
         * @return bool
         */
        protected function checkError($key)
        {
            if ($this->file_error > UPLOAD_ERR_OK) {
                switch($this->file_error) {
                    case UPLOAD_ERR_INI_SIZE:
                    case UPLOAD_ERR_FORM_SIZE:
                    case UPLOAD_ERR_PARTIAL:
                    case UPLOAD_ERR_NO_FILE:
                    case UPLOAD_ERR_NO_TMP_DIR:
                    case UPLOAD_ERR_CANT_WRITE:
                    case UPLOAD_ERR_EXTENSION:
                        $this->setError($key, self::UPLOAD_ERROR[$this->file_error]);
                        return false;
                }
            }
            return true;
        }


        /**
         * @param $key
         * @return bool
         */
        protected function checkMime($key)
        {
            if (!in_array($this->file_type[$key], $this->allow_mime)) {
                $this->setError($key, '文件類型' . $this->file_type[$key] . '不被允許!');
                return false;
            }
            return true;
        }


        /**
         * @param $key
         * @return bool
         */
        protected function checkExt($key)
        {
            $this->extension[$key] = pathinfo($this->file_org_name[$key],


	
您的分享是我們最大的動力!

更多相關文章
  • go語言基礎 雖然這本書是講goweb,但還是吧go語言基礎過了一遍,由於我之前已經對go語言基礎做了一遍系統的學習,這裡就當簡單回顧一下,不再寫過多筆記了,之前的寫的博客都有基礎知識,O(∩_∩)O哈哈~ Go是天生支持UTF 8的,任何字元都可以直接輸出,你甚至可以用UTF 8中的任何字元作為標 ...
  • 最近寫了個單元測試,遞歸調用方法,把同一個文件夾里所有的txt合併輸出到一個txt文件。參考了兩個博客,分別是已有的方法,還有個就是檢測txt文件所用編碼的技術貼。如果不檢測txt文件的編碼,那麼轉換出的txt文件大概率會亂碼。一開始嘗試UTF-8和GBK等編碼格式轉換後都是亂碼,一度以為是方法的問 ...
  • pip install pillow 基本使用 ...
  • 安裝go及配置go 安裝go 寫這篇博客時,我的電腦的windows已經安裝過了go,用的是標準包安裝,不過我的linux操作系統還沒安裝,可以考慮用第三方工具安裝,因為看了goweb這本書,我才知道安裝go有三種方式。這本書對三種操作系統的安裝方式都有介紹 Go源碼安裝:這是一種標準的軟體安裝方式 ...
  • 前言 前段時間做了一個圖床的小項目,安全框架使用的是 。為了使用戶 小時訪問,決定把項目由單機升級為集群部署架構。但是安全框架 只有單機存儲的 ,儘管 有基於 的組播/廣播實現,然而集群的分佈往往是跨網段的,甚至是跨地域的,所以尋求新的方案。 架構 方案 使用 集中存儲,實現分散式集群共用用戶信息, ...
  • 楊輝三角 楊輝三角,是二項式繫數在三角形中的一種幾何排列,中國南宋數學家楊輝1261年所著的《詳解九章演算法》一書中出現。在歐洲,帕斯卡(1623 1662)在1654年發現這一規律,所以這個表又叫做帕斯卡三角形。帕斯卡的發現比楊輝要遲393年,比賈憲遲600年。 如圖: 它的規律是,除了每一行的第一 ...
  • #定義嵌套函數 def func1(): print('this is func1') def func2(): print('this is func2')#調用1func1()輸出:this is func1上面沒有輸出this is func2,說明嵌套子函數func2()沒有被調用原因:一個 ...
  • 定時任務我想大家都不預設,現在流行的框架spring就帶了定時任何 我的個人網站(http://www.yzcopen.com)上用戶上傳的文件都是用這套定時任務執行定時清除 第一步:在applicationContext.xml中加增加以下配置代碼 <!--要調度的對象--> <bean id=" ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...