Heim > Backend-Entwicklung > PHP-Tutorial > Tipps zur Backend-Verarbeitung von Datei-Uploads in PHP

Tipps zur Backend-Verarbeitung von Datei-Uploads in PHP

墨辰丷
Freigeben: 2023-03-29 13:02:02
Original
1517 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich die Back-End-Verarbeitungstipps für das Hochladen von PHP-Dateien ausführlich vorgestellt, damit Sie Datei-Upload-Vorgänge besser durchführen können.

In diesem Artikel wird darüber gesprochen: Welche Techniken gibt es für die Back-End-Verarbeitung? -Endverarbeitung von PHP-Datei-Uploads?

Geschäftsszenario 1 Wir wählen nur eine einzelne Datei zum Hochladen aus und es ist keine sofortige Überprüfung erforderlich. Dann gibt es möglicherweise überhaupt keine Optimierung, denn am Ende müssen Sie diese Datei nur noch in das Formular einfügen, sie zusammen senden und sie dann direkt verarbeiten!

Geschäftsszenario 2 Es müssen mehrere Dateien hochgeladen werden, und der interne Inhalt der Dateien muss von Zeit zu Zeit überprüft und auf der entsprechenden Seite angezeigt werden . In diesem Fall müssen wir die Datei sofort hochladen, nachdem der Benutzer sich zum Hochladen der Datei entschieden hat, da wir die Informationen in der Datei lesen müssen. Wenn wir sie am Ende übermitteln, müssen wir die Datei auch einmal übermitteln. Offensichtlich gibt es hier eine sich wiederholende Upload-Aufgabe, die die Zeit des Benutzers und die andere die Bandbreitenressourcen des Servers verbraucht. Die denkbare Methode zur Optimierung ist ebenfalls sehr einfach. Nach dem ersten Hochladen der Datei kann die Datei auf dem Server gespeichert werden und beim tatsächlichen Absenden des Formulars einfach die hochgeladene temporäre Datei gelesen werden. Ja, das ist unser Ansatz!

Geschäftsszenario drei ähnelt Szenario zwei, es müssen mehrere Dateien hochgeladen werden, es können jedoch mehrere Dateien separat hochgeladen werden. Das heißt, wir haben möglicherweise 10 Millionen zum ersten Mal, 10 Millionen zum zweiten Mal und insgesamt 10 Mal hochgeladen. Dann muss die einmalige Übermittlung auf der Serverseite die Upload-Größenbeschränkung überschritten haben, aber wenn ja Das Hochladen ist jedes Mal möglich und beim Absenden müssen wir nur eine kurze Textnachricht hochladen!

Die Idee ist in der Tat einfach und es scheint kein Problem zu sein. Vielleicht sind meine Fähigkeiten jedoch begrenzt und ich habe wirklich viel Zeit gebraucht, um damit umzugehen! Nachfolgend gebe ich einen Beispielcode als Referenz:

Datei-Upload-Technik (Vorhandensein einer einzelnen hochgeladenen Datei als temporäre Datei auf der Serverseite) Beispielcode:

1. Seiten-JS-Verarbeitung

    //点击选择完成文件后,触发上传文件操作,将文件上传至服务器临时目录
    $('.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 自动关闭
    });
Nach dem Login kopieren

2. Offensichtlich muss die Seite Dateiinformationen abrufen und eine Hintergrundverarbeitung durchführen Code ( 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));
  }
Nach dem Login kopieren

3 Durch die Kombination der beiden Teile des Codes haben wir bereits die richtigen Informationen auf der Seite, einfach nicht. Wenn Sie das Formular am Ende abschicken, müssen Sie die Datei nicht an den Server senden. Bei der Verarbeitung auf der Serverseite verschieben Sie einfach die zuvor hochgeladene temporäre Datei, und schon sind Sie fertig!

$('.upload-file-real').attr('disabled', 'disabled'); // Hochladen von Dateien vor dem Absenden des Formulars deaktivieren

4. Folgearbeiten

Nach dem Hochladen der temporären Datei auf den Server gibt es keine Möglichkeit zu beurteilen, ob der Benutzer den aktuellen Vorgang abbricht wird immer auf dem Server vorhanden sein, daher benötigen wir ein Skript, um das temporäre Verzeichnis regelmäßig zu bereinigen. Das ist natürlich ganz einfach. Sie müssen nur dieses Verzeichnis finden und die Uhrzeit vergleichen. Beispielsweise werden Dateien gelöscht, die älter als ein Tag sind. Achten Sie einfach darauf, die Häufigkeit der Reinigung zu kontrollieren!

5. Exkurs

ProtokollEs ist wirklich wichtig, wo ist etwas schief gelaufen, wo wurde die Datei gelöscht, wo Achten Sie nach dem Bereinigen der Datenbank darauf, Aufzeichnungen zu führen!

Das Hochladen von Dateien in das temporäre Verzeichnis des Servers scheint sehr einfach zu sein, aber es erfordert auch ein sorgfältiges Debuggen. Zumindest als ich diese kleine Funktion ausführte, hat es viel gekostet Mühe, es herauszufinden!

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:

So implementieren Sie einfach die Funktion zum Abrufen von Mitgliederpasswörtern in PHP

So aktivieren Sie Opcode in PHP7 um eine leistungsstarke Leistung zu erzielen. Ausführliche Erklärung

PHP löst das Problem der Kaninchengebärung auf der Grundlage eines rekursiven Algorithmus

Das obige ist der detaillierte Inhalt vonTipps zur Backend-Verarbeitung von Datei-Uploads in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage