PHP でのファイルアップロードのバックエンド処理に関するヒント

墨辰丷
リリース: 2023-03-29 13:02:02
オリジナル
1465 人が閲覧しました

この記事では、ファイル アップロード操作をより効率的に実行できるように、主に PHP ファイル アップロード バックエンド処理のヒントを詳しく紹介します。興味のある方は参考にしてください。

この記事では、PHP ファイル アップロード バックエンド処理について説明します。コツはありますか? ?

ビジネスシナリオ 1。アップロードするファイルを 1 つだけ選択します。すぐに検証作業を行う必要はありません。その場合、最適化はまったく行われない可能性があります。最終的にしなければならないことは、このファイルをフォームに入力して一緒に送信し、直接処理することだけだからです。

ビジネスシナリオ 2。複数のファイルをアップロードする必要があり、ファイルの内部コンテンツを随時検証して、対応するページに表示する必要があります。この場合、ユーザーがファイルのアップロードを選択した後、ファイル内の情報を読み取る必要があるため、ファイルをすぐにアップロードする必要があり、最後に送信するときにもファイルを一度送信する必要があります。明らかに、ここには反復的なアップロード タスクがあり、1 つはユーザーの時間を消費し、もう 1 つはサーバーの帯域幅リソースを消費します。最適化の方法としては、初回にファイルをアップロードした後、そのファイルをサーバー上に保持しておき、実際にフォームを送信するときに、アップロードされた一時ファイルを読み取るだけでよいという方法も考えられます。はい、これが私たちのアプローチです!

ビジネス シナリオ 3 はシナリオ 2 と似ていますが、複数のファイルを個別にアップロードすることができます。つまり、最初に 10M、2 回目に 10M、合計 10 回アップロードした可能性があります。そうすると、サーバー側では 1 回の送信がアップロード サイズの制限を超えたはずですが、もしそうなら。毎回アップロードすることも可能で、投稿する際は短いテキストメッセージをアップロードするだけです!

確かに考え方はシンプルで問題なさそうですが、私の能力が限界なのか、これに取り組むのに本当に時間がかかりました。以下に、参考としてサンプルコードを示します:

ファイルアップロードスキル (単一のアップロードされたファイルをサーバー側に一時ファイルとして存在) サンプルコード:

1. ページ js 処理

    //点击选择完成文件后,触发上传文件操作,将文件上传至服务器临时目录
    $('.upload-real-file').off().on('change', function(){
      if(!$(this).val()){
        return false;
      }
      var responseObjId = $(this).attr('response-id');
      var responseObj = $('#' + responseObjId);
      $('#Form').ajaxSubmit({
        url:'/aa/bb/uploadTmpApkTool',
        resetForm: false,
        dataType: 'json',
        beforeSubmit: function(option){
          window.loading = layer.load(2);
        },
        success: function(data, statusText){
          layer.close(window.loading);
          if(data.status == 1){
            responseObj.html(data.apkInfoHtml);
            var parentContainer = responseObj.parent().parent(),
              nameContainer = parentContainer.find('.file-name-container');
            nameContainer.html(data.apkName);
            nameContainer.attr('title', data.apkName);
            responseObj.find('.file-tmp').html(data.fileInfo); //将文件信息存放于隐藏域中,以便在提交时能找到  
            $(submitId).removeAttr('disabled');
          }else{
            layer.alert(data.info);
          }
        },
        error: function(data){
          layer.close(window.loading);
          layer.alert('未知错误,请稍后再试!');
        }
      });
      return false;//防止dialog 自动关闭
    });
ログイン後にコピー

2. 明らかに、ページはファイル情報とバックグラウンド処理コード (PHP) を取得する必要があります

    $apkConfig = $this->_getApkConfig();
    $params = $this->getFilteredParam('get');
    $subFile = $_FILES['apkToolFiles'];
    $apkName = $apkInfoHtml = "";
    if(empty($subFile))
    {
      $this->ajaxReturn(array('status' => -4, 'info' => '请选择要上传的文件'));
    }

    foreach ($subFile['name'] as $subKey => $subVal)
    {
      if ($subFile['name'][$subKey])
      {
        $fileData = $this->_getFileData($subFile, $subKey);
        $checkData = array(
          'maxSize' => $apkConfig['FILE_MAX_SIZE'],
          'savePath' => $apkConfig['TMP_CHILD_PATH'],
          'extArr' => array('apk'),
          'releaseName' => str_replace('.apk', '', $fileData['fileName']), //特有
        );
        $checkResult = $this->_checkFileData($fileData, $checkData);
        if ($checkResult['status'] != 1)
        {
          $this->ajaxReturn($checkResult);
        }
        //移动文件
        $filePath = $checkData['savePath'] . '/' . $fileData['fileName'] . '.tmp' . genRandStr(6);;
        $this->_moveUploadedFile($fileData['tmpName'], $filePath);
        $apkInfo = $this->_apkParser($filePath); //解析
        if($apkInfo['UMENG_CHANNEL'] != 'UMENG_CHANNEL_VALUE')
        {
          @unlink($filePath);               //删除无效文件
          $this->ajaxReturn(array('status' => 0, 'info' => "UMENG_CHANNEL的值要是 UMENG_CHANNEL_VALUE才行"));
        }
        $tmpFileArr['file_info'] = array(
          'name' => $subFile['name'][$subKey],
          'type' => $subFile['type'][$subKey],
          'tmp_name' => str_replace($apkConfig['TMP_CHILD_PATH'] . '/', '', $filePath),
          'error' => $subFile['error'][$subKey],
          'size' => $subFile['size'][$subKey],
        );       //转存该值,不再重复上传文件
      }
      else
      {
        $this->ajaxReturn(array('status' => 0, 'info' => "文件不能为空"));
      }
      foreach ($apkInfo as $key => $val)
      {
        $apkInfoHtml .= "{$key}:{$val} \r\n";
      }
      $apkName = $fileData['fileName'];
      $version = $apkInfo['versionName'];
    }
    $fileInfo = htmlspecialchars(json_encode($tmpFileArr['file_info']));
    $fileInfoHtml = "<input name=\"apkToolFileTmp[]\" value=&#39;{$fileInfo}&#39; type=\"hidden\"/>";  //一定要输出前使用htmlspecialchars, 否则不能正确显示页面值和获取至正确的文件信息

    $this->ajaxReturn(array(&#39;status&#39; => 1, &#39;info&#39; => "上传成功", &#39;version&#39; => $version, &#39;item&#39; => $item, &#39;apkName&#39; => $apkName, &#39;apkInfoHtml&#39; => $apkInfoHtml, &#39;fileInfo&#39; => $fileInfoHtml));
  }
ログイン後にコピー

3。最後にフォームを送信するときにファイルをサーバーに送信せず、サーバー側で処理する場合は、前にアップロードした一時ファイルを移動するだけで完了です。

$('.upload-file-real').attr('disabled', 'disabled'); //フォームを送信する前に、ファイルのアップロードを無効にします

4.一時ファイルを置き換える サーバーにアップロードした後、ユーザーが現在の操作をキャンセルしたかどうかを確認する方法はありません。キャンセルされた場合、一時ファイルは常にサーバー上に存在するため、一時ディレクトリを定期的に削除するスクリプトが必要です。もちろん、これは非常に簡単です。たとえば、1 日より古いファイルは削除されます。掃除の頻度をコントロールすることに注意してください。

5. 余談

ログ

は、問題が発生した場所、ファイルが削除された場所、データベースがクリーンアップされた場所を必ず記録してください。 ファイルをサーバーの一時ディレクトリにアップロードします。バックエンドの処理原理は非常に単純に見えますが、少なくともこの小さな機能を実行していたときは、理解するのに多大な労力を要しました。それはアウトです!

要約: 上記がこの記事の全内容です。皆様の学習に役立つことを願っています。

関連する推奨事項:

PHPでメンバーのパスワード取得機能を簡単に実装する方法


PHP7でOpcodeを有効にして強力なパフォーマンスを生み出す方法の詳細な説明


PHPはウサギの出産の問題を解決します再帰アルゴリズムに基づいてウサギに


以上がPHP でのファイルアップロードのバックエンド処理に関するヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!