ホームページ バックエンド開発 PHPチュートリアル 古典的なPHP多機能ファイルアップロードクラスのサンプルの詳細な説明

古典的なPHP多機能ファイルアップロードクラスのサンプルの詳細な説明

Jun 27, 2017 pm 02:00 PM
php 多機能

ファイルアップロードはプロジェクト開発の一般的な機能ですが、ファイルアップロードのプロセスは比較的面倒で、ファイルをアップロードする場所には常にこれらの複雑なコードを記述する必要があります。開発ごとに関数を記述する難しさを軽減し、開発時間を節約するために、通常、これらの繰り返し使用されるコード部分をクラスにカプセル化します。将来の開発において、開発者がいくつかの簡単なコードを記述することで複雑なファイル アップロード機能を実装できるようにします。基礎が弱い読者にとっては、このクラスを使用できれば十分です。挑戦するのが好きな人は、それを理解して独自の ファイル アップロード クラスを開発することができます。

1. 要件分析

非常に使いやすいことを前提として、以下の機能を完了できるファイルアップロードクラスをカスタマイズする必要があります:
①単一ファイルのアップロードをサポートします。
②複数のファイルのアップロードをサポートします。
③アップロードしたファイルの保存場所を自分で指定でき、アップロードしたファイルに許可されるサイズと種類を設定でき、アップロードしたファイルの名前をシステムによって変更でき、アップロードしたファイルの元の名前を設定することもできます保持されます。
(注:単一ファイルのアップロードと複数ファイルのアップロードでは同じ操作方法を使用する必要があり、アップロードに関する一部の設定も同じ方法で行う必要があります)。

2. プログラミング

プログラムの要件に基づいて、ファイル アップロード クラスの 4 つの可視メンバー属性を宣言できるため、ユーザーが使用時にいくつかの動作を設定することもできます。必要なメンバー属性は次の表に示すとおりです。

属性値に不正な値が割り当てられるのを防ぐために、これらのメンバー属性はカプセル化する必要があり、オブジェクトの外部からアクセスすることはできません。クラス内で宣言されたset()メソッド 上記4つのメンバー属性に値を代入します。 set() メソッドには 2 つのパラメータがあります。最初のパラメータはメンバーの属性名 (大文字と小文字は区別されません) で、2 番目のパラメータは前のパラメータの属性に対応する値です。 set() メソッドが呼び出された後、オブジェクト ($this) が返されるため、各属性に個別に値を割り当てるだけでなく、連続した操作を実行して複数の属性に同時に値を割り当てることもできます。 。この例では、set() メソッドに加えて、ファイルをアップロードする機能を実装することが最も重要であるため、システムは主に、次の表に示すように、ファイルのアップロード操作を実装する次のパブリック メソッドを提供します。

属性を避けるために、値にはいくつかの不正な値が割り当てられています。これらのメンバー属性はカプセル化する必要があり、オブジェクトの外部からアクセスすることはできません。その後、宣言された set() メソッドを通じて上記の 4 つのメンバー属性に値が割り当てられます。クラスで。 set() メソッドには 2 つのパラメータがあります。最初のパラメータはメンバーの属性名 (大文字と小文字は区別されません) で、2 番目のパラメータは前のパラメータの属性に対応する値です。 set() メソッドが呼び出された後、オブジェクト ($this) が返されるため、各属性に個別に値を割り当てるだけでなく、連続した操作を実行して複数の属性に同時に値を割り当てることもできます。 。この例では、set() メソッドに加えて、ファイルをアップロードする機能を実装することが最も重要であるため、システムは主に、次の表に示すように、ファイルのアップロード操作を実装する次のパブリック メソッドを提供します。

4. ファイル アップロード クラス アプリケーション プロセス

この例のファイル アップロード クラス FileUpload は、単一ファイルのアップロードと、複数のファイルを一緒にサーバーにアップロードする両方をサポートしています。アップロード入札を記述する場合を除いて、処理方法に違いはありません。 、複数のファイル アップロードは配列でサーバーに渡される必要があります。単一ファイルのアップロード フォームは次のとおりです:

<?php
  /** 
    file: fileupload.class.php 文件上传类FileUpload
    本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传
  */
  class FileUpload { 
    private $path = "./uploads";          //上传文件保存的路径
    private $allowtype = array(&#39;jpg&#39;,&#39;gif&#39;,&#39;png&#39;); //设置限制上传文件的类型
    private $maxsize = 1000000;           //限制文件上传大小(字节)
    private $israndname = true;           //设置是否随机重命名文件, false不随机
 
    private $originName;              //源文件名
    private $tmpFileName;              //临时文件名
    private $fileType;               //文件类型(文件后缀)
    private $fileSize;               //文件大小
    private $newFileName;              //新文件名
    private $errorNum = 0;             //错误号
    private $errorMess="";             //错误报告消息
 
    /**
     * 用于设置成员属性($path, $allowtype,$maxsize, $israndname)
     * 可以通过连贯操作一次设置多个属性值
     *@param  string $key  成员属性名(不区分大小写)
     *@param  mixed  $val  为成员属性设置的值
     *@return  object     返回自己对象$this,可以用于连贯操作
     */
    function set($key, $val){
      $key = strtolower($key); 
      if( array_key_exists( $key, get_class_vars(get_class($this) ) ) ){
        $this->setOption($key, $val);
      }
      return $this;
    }
 
    /**
     * 调用该方法上传文件
     * @param  string $fileFile  上传文件的表单名称 
     * @return bool        如果上传成功返回数true 
     */
 
    function upload($fileField) {
      $return = true;
      /* 检查文件路径是滞合法 */
      if( !$this->checkFilePath() ) {       
        $this->errorMess = $this->getError();
        return false;
      }
      /* 将文件上传的信息取出赋给变量 */
      $name = $_FILES[$fileField][&#39;name&#39;];
      $tmp_name = $_FILES[$fileField][&#39;tmp_name&#39;];
      $size = $_FILES[$fileField][&#39;size&#39;];
      $error = $_FILES[$fileField][&#39;error&#39;];
 
      /* 如果是多个文件上传则$file["name"]会是一个数组 */
      if(is_Array($name)){    
        $errors=array();
        /*多个文件上传则循环处理 , 这个循环只有检查上传文件的作用,并没有真正上传 */
        for($i = 0; $i < count($name); $i++){ 
          /*设置文件信息 */
          if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i] )) {
            if(!$this->checkFileSize() || !$this->checkFileType()){
              $errors[] = $this->getError();
              $return=false; 
            }
          }else{
            $errors[] = $this->getError();
            $return=false;
          }
          /* 如果有问题,则重新初使化属性 */
          if(!$return)          
            $this->setFiles();
        }
 
        if($return){
          /* 存放所有上传后文件名的变量数组 */
          $fileNames = array();      
          /* 如果上传的多个文件都是合法的,则通过销魂循环向服务器上传文件 */
          for($i = 0; $i < count($name); $i++){ 
            if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i] )) {
              $this->setNewFileName(); 
              if(!$this->copyFile()){
                $errors[] = $this->getError();
                $return = false;
              }
              $fileNames[] = $this->newFileName;  
            }          
          }
          $this->newFileName = $fileNames;
        }
        $this->errorMess = $errors;
        return $return;
      /*上传单个文件处理方法*/
      } else {
        /* 设置文件信息 */
        if($this->setFiles($name,$tmp_name,$size,$error)) {
          /* 上传之前先检查一下大小和类型 */
          if($this->checkFileSize() && $this->checkFileType()){ 
            /* 为上传文件设置新文件名 */
            $this->setNewFileName(); 
            /* 上传文件  返回0为成功, 小于0都为错误 */
            if($this->copyFile()){ 
              return true;
            }else{
              $return=false;
            }
          }else{
            $return=false;
          }
        } else {
          $return=false; 
        }
        //如果$return为false, 则出错,将错误信息保存在属性errorMess中
        if(!$return)
          $this->errorMess=$this->getError();  
 
        return $return;
      }
    }
 
    /** 
     * 获取上传后的文件名称
     * @param  void   没有参数
     * @return string 上传后,新文件的名称, 如果是多文件上传返回数组
     */
    public function getFileName(){
      return $this->newFileName;
    }
 
    /**
     * 上传失败后,调用该方法则返回,上传出错信息
     * @param  void   没有参数
     * @return string  返回上传文件出错的信息报告,如果是多文件上传返回数组
     */
    public function getErrorMsg(){
      return $this->errorMess;
    }
 
    /* 设置上传出错信息 */
    private function getError() {
      $str = "上传文件<font color=&#39;red&#39;>{$this->originName}</font>时出错 : ";
      switch ($this->errorNum) {
        case 4: $str .= "没有文件被上传"; break;
        case 3: $str .= "文件只有部分被上传"; break;
        case 2: $str .= "上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
        case 1: $str .= "上传的文件超过了php.ini中upload_max_filesize选项限制的值"; break;
        case -1: $str .= "未允许类型"; break;
        case -2: $str .= "文件过大,上传的文件不能超过{$this->maxsize}个字节"; break;
        case -3: $str .= "上传失败"; break;
        case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
        case -5: $str .= "必须指定上传文件的路径"; break;
        default: $str .= "未知错误";
      }
      return $str.&#39;<br>&#39;;
    }
 
    /* 设置和$_FILES有关的内容 */
    private function setFiles($name="", $tmp_name="", $size=0, $error=0) {
      $this->setOption(&#39;errorNum&#39;, $error);
      if($error)
        return false;
      $this->setOption(&#39;originName&#39;, $name);
      $this->setOption(&#39;tmpFileName&#39;,$tmp_name);
      $aryStr = explode(".", $name);
      $this->setOption(&#39;fileType&#39;, strtolower($aryStr[count($aryStr)-1]));
      $this->setOption(&#39;fileSize&#39;, $size);
      return true;
    }
 
    /* 为单个成员属性设置值 */
    private function setOption($key, $val) {
      $this->$key = $val;
    }
 
    /* 设置上传后的文件名称 */
    private function setNewFileName() {
      if ($this->israndname) {
        $this->setOption(&#39;newFileName&#39;, $this->proRandName());  
      } else{ 
        $this->setOption(&#39;newFileName&#39;, $this->originName);
      } 
    }
 
    /* 检查上传的文件是否是合法的类型 */
    private function checkFileType() {
      if (in_array(strtolower($this->fileType), $this->allowtype)) {
        return true;
      }else {
        $this->setOption(&#39;errorNum&#39;, -1);
        return false;
      }
    }
 
    /* 检查上传的文件是否是允许的大小 */
    private function checkFileSize() {
      if ($this->fileSize > $this->maxsize) {
        $this->setOption(&#39;errorNum&#39;, -2);
        return false;
      }else{
        return true;
      }
    }
 
    /* 检查是否有存放上传文件的目录 */
    private function checkFilePath() {
      if(empty($this->path)){
        $this->setOption(&#39;errorNum&#39;, -5);
        return false;
      }
      if (!file_exists($this->path) || !is_writable($this->path)) {
        if (!@mkdir($this->path, 0755)) {
          $this->setOption(&#39;errorNum&#39;, -4);
          return false;
        }
      }
      return true;
    }
 
    /* 设置随机文件名 */
    private function proRandName() {    
      $fileName = date(&#39;YmdHis&#39;)."_".rand(100,999);    
      return $fileName.&#39;.&#39;.$this->fileType; 
    }
 
    /* 复制上传文件到指定的位置 */
    private function copyFile() {
      if(!$this->errorNum) {
        $path = rtrim($this->path, &#39;/&#39;).&#39;/&#39;;
        $path .= $this->newFileName;
        if (@move_uploaded_file($this->tmpFileName, $path)) {
          return true;
        }else{
          $this->setOption(&#39;errorNum&#39;, -3);
          return false;
        }
      } else {
        return false;
      }
    }
  }
ログイン後にコピー

上記のフォームはすべて、送信場所が同じファイル Upload.php を指しているため、単一ファイルと複数ファイルのアップロードが同じ方法で処理されることは難しくありません。 .php コードは次のとおりです。 表示:

<form action="upload.php" method="post" enctype="multipart/form-data" >
    name: <input type="text" name="username" value="" /><br>
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    up pic: <input type="file" name="pic[]" value=""><br>
    up pic: <input type="file" name="pic[]" value=""><br>
    up pic: <input type="file" name="pic[]" value=""><br>
    up pic: <input type="file" name="pic[]" value=""><br>
 
    <input type="submit" value="upload" /><br>
 
</form>
ログイン後にコピー

Upload.php ファイルでは、まず、ファイル アップロードの FileUpload クラスが配置されているファイル fileupload.class.php をロードする必要があります。次に、ファイル アップロード クラスのオブジェクトをインスタンス化し、upload() メソッドを呼び出してファイルをアップロードします。アップロードが成功した場合は、getFileName() メソッドを使用してアップロードされたファイル名を取得できます。 getErrorMsg() Report を通じてエラーを取得することもできます。アップロード動作の一部を変更する必要がある場合は、set() メソッドを呼び出して一部の属性の設定を完了できます。 set() メソッドを単独で使用して属性の値を設定することもできます。複数の属性の値を変更する必要がある場合は、set() メソッドを連続して呼び出して設定することも、複数の属性を一度に設定することもできます。連続運転でも同じ時間。

以上が古典的なPHP多機能ファイルアップロードクラスのサンプルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles