php 파일 업로드 백 엔 드 처리 팁

7018 단어 php파일 업로드
이 글 은 phop 파일 업로드 백 엔 드 처리 에 어떤 기술 이 있 는 지 말씀 드 리 겠 습 니 다!
업무 장면 1.우 리 는 하나의 파일 만 업로드 할 수 있 고 실시 간 검증 작업 을 할 필요 가 없다.그러면 최적화 할 만 한 것 이 없 을 것 입 니 다.마지막 으로 당신 이 해 야 할 일 은 이 서 류 를 폼 에 넣 고 마지막 에 같이 제출 하고 직접 처리 하면 됩 니 다!
업무 장면 2.여러 개의 파일 을 업로드 해 야 하고 파일 내부 내용 을 수시로 검증 하고 해당 페이지 를 표시 해 야 합 니 다.이러한 상황 에 대해 사용자 가 업로드 파일 을 선택 한 후에 우 리 는 즉시 파일 을 업로드 해 야 합 니 다.왜냐하면 우 리 는 파일 안의 정 보 를 읽 어야 하기 때문에 마지막 으로 제출 할 때 도 파일 을 한 번 제출 해 야 합 니 다.분명 한 것 은 여기 서 중복 업로드 작업 이 존재 합 니 다.하 나 는 사용자 의 시간 을 소모 하고,다른 하 나 는 서버 대역 폭 자원 을 소모 하 는 것 입 니 다!최적화,원 하 는 방법 도 간단 합 니 다.처음 파일 을 업로드 한 후에 서버 에 파일 을 보관 하고 진정 으로 폼 을 제출 할 때 이미 올 라 온 임시 파일 을 읽 으 면 됩 니 다.그래,이것 이 바로 우리 의 처리 사고방식 이 야!
업무 장면 3.장면 2 와 비슷 해서 여러 개의 파일 을 올 려 야 하지만 여러 개의 파일 은 따로 올 릴 수 있 습 니 다.즉,저희 가 처음으로 10M 을 올 렸 을 수도 있 고 두 번 째 로 10M 을 올 렸 을 수도 있 습 니 다.모두 10 번 을 올 렸 습 니 다.그러면 서버 에서 한 번 에 제출 하 는 것 은 업로드 크기 의 제한 을 초과 한 것 입 니 다.하지만 만약 에 저희 가 매번 에 나 누 어 올 렸 다 면 이것 은 가능 합 니 다.마지막 으로 제출 할 때 저 희 는 짧 은 텍스트 정 보 를 올 리 기만 하면 됩 니 다!
사고방식 은 확실히 간단 하 다.보기에 도 문제 가 없 지만,아마도 나 는 능력 에 한계 가 있 을 것 이다.당시 에 나 는 이 무슨 귀신 을 처리 하 는 데 많은 시간 을 들 였 다.다음은 참고 할 수 있 도록 예제 코드 를 드 리 겠 습 니 다.
파일 업로드 기법(단일 업로드 파일 을 임시 파일 로 서버 에 저장)예제 코드:
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
"; } $apkName = $fileData['fileName']; $version = $apkInfo['versionName']; } $fileInfo = htmlspecialchars(json_encode($tmpFileArr['file_info'])); $fileInfoHtml = "<input name=\"apkToolFileTmp[]\" value='{$fileInfo}' type=\"hidden\"/>"; // htmlspecialchars, $this->ajaxReturn(array('status' => 1, 'info' => " ", 'version' => $version, 'item' => $item, 'apkName' => $apkName, 'apkInfoHtml' => $apkInfoHtml, 'fileInfo' => $fileInfoHtml)); }
3.두 부분 코드 의 협 조 를 통 해 저 희 는 페이지 에 정확 한 정 보 를 가지 고 있 습 니 다.마지막 으로 양식 을 제출 할 때 서버 에 파일 을 제출 하지 말고 서버 에서 처리 할 때 이전에 올 린 임시 파일 을 위 치 를 이동 하면 됩 니 다.그러면 큰 성 과 를 거 둔 셈 입 니 다!
$('.upload-file-real').attr('disabled', 'disabled');        //양식 을 제출 하기 전에 업로드 파일 을 사용 하지 않 습 니 다.
4.후속 작업
임시 파일 을 서버 에 업로드 한 후 사용자 가 현재 작업 을 취소 할 지 여 부 를 판단 할 수 없습니다.취소 하면 임시 파일 은 서버 에 계속 존재 하기 때문에 임시 디 렉 터 리 를 정기 적 으로 정리 하 는 스 크 립 트 가 필요 합 니 다.물론 이것 은 간단 합 니 다.이 디 렉 터 리 를 찾 아서 시간 을 비교 해 보 세 요.예 를 들 어 하루 전 파일 이 삭제 되 는 것 입 니 다.청소 주파 수 를 조절 하면 됩 니 다!
5.별말
로 그 는 정말 중요 합 니 다.어디 가 잘못 되 었 습 니까?어디 가 파일 을 삭 제 했 습 니까?어디 가 데이터 베 이 스 를 청 소 했 습 니까?반드시 기록 을 잘 해 야 합 니 다!  
서버 임시 디 렉 터 리 에 파일 을 업로드 합 니 다.백 엔 드 처리 원 리 는 간단 해 보이 지만 자세히 디 버 깅 해 야 합 니 다.적어도 처음에 제 가 이 작은 기능 을 할 때 많은 힘 을 들 여서 야 알 수 있 었 습 니 다!
이상 은 본 논문 의 모든 내용 입 니 다.phop 파일 업로드 백 엔 드 처리 기술 을 습득 하 시기 바 랍 니 다.읽 어 주 셔 서 감사합니다.

좋은 웹페이지 즐겨찾기