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

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

單文件上傳前端頁面 <!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],
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 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=" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...