Heim  >  Artikel  >  php教程  >  Praktische Tipps und Methoden für die Back-End-Verarbeitung beim Hochladen von PHP-Dateien

Praktische Tipps und Methoden für die Back-End-Verarbeitung beim Hochladen von PHP-Dateien

高洛峰
高洛峰Original
2017-01-06 14:54:121518Durchsuche

Praktische Tipps und Methoden für die Back-End-Verarbeitung beim Hochladen von PHP-Dateien

Zitat: Wie im vorherigen Artikel erwähnt, können Sie versteckte Methoden auf der Seite verwenden, um Ihre Upload-Seite schön aussehen zu lassen. Aber das bringt der Leistung nichts, gibt es also nicht einige Verarbeitungstechniken in der Hintergrundverarbeitung? Zu den sogenannten Hintergrundkenntnissen gehören das schnellere Hochladen und das Hochladen größerer Dateien! In diesem Artikel geht es also darum, welche Fähigkeiten es in der Back-End-Verarbeitung gibt!

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:

Fähigkeiten zum Hochladen von Dateien (einzelne hochgeladene Dateien sind als temporäre Dateien auf der Serverseite vorhanden) Beispielcode:

1. Seite 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 自动关闭
 });

2. Offensichtlich muss die Seite Dateiinformationen und Hintergrundverarbeitungscode (PHP) erhalten.

$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 Durch die Zusammenarbeit der beiden Codeteile gibt es bereits Korrekte Informationen auf der Seite. Sie müssen die Datei nur dann an den Server senden, wenn Sie das Formular am Ende absenden. Bei der Verarbeitung auf der Serverseite müssen Sie nur die zuvor hochgeladene temporäre Datei verschieben, und schon sind Sie fertig!

$(&#39;.upload-file-real&#39;).attr(&#39;disabled&#39;, &#39;disabled&#39;);  //提交表单前,禁用上传文件

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

Protokolle sind wirklich wichtig, wo etwas schief gelaufen ist, wo Dateien gelöscht wurden und wo die Datenbank bereinigt wurde. Ansonsten müssen Sie es genau aufzeichnen Gründe, wo man um Hilfe schreien kann!

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

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung dieser Website!

Weitere Artikel zu praktischen Tipps und Methoden für die Back-End-Verarbeitung des PHP-Datei-Uploads finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
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