2014-05-12 3 views
0

팀 프로젝트에서 업로드 프로세스가 어떻게 진행되는지에 대한 간단한 설명.업로드 중간에 파일 업로드가 중단되었습니다.

클라이언트 측에서는 AJAX를 통해 응용 프로그램 서버에 업로드 서비스를 호출합니다. 그런 다음 응용 프로그램 서버는 Curl을 통해 파일 서버로 파일을 전달합니다 (파일 서버는 비공개이며 응용 프로그램 서버에서만 액세스 할 수 있습니다).

상황은 다음과 같습니다.

파일이 업로드 될 때 이미 응용 프로그램 서버를 통과하고 이미 파일 서버에 도달했습니다. 그러나 데이터가 클라이언트 측으로 다시 전달되기 전에 사용자가 클라이언트에서 취소 버튼을 클릭하십시오.

사용자가 요청을 중단 한 경우 응용 프로그램 서버에서 확인한 다음 파일 서버에 이미 삭제 된 파일이 있으면이 파일을 삭제하는 방법은 무엇입니까? 업로드가 취소 된 경우

내 솔루션

  1. PHP는 ignore_user_abort=false을 설정하는 경우에, 나는 확인할 수 없습니다. 그래서 저는 말리기 전에 true으로 설정했습니다.

    ini_set('ignore_user_abort', TRUE); 
    

    **

    는, BTW ignore_user_abort=false은 여전히 ​​스크립트 호출이 중단 즉시 후에도 컬 실행을 종료하지.

  2. 통화가 중단 된 경우 진행률을 추적하도록 CURLOPT_NOPROGRESS을 설정하십시오.

    curl_setopt($ch, CURLOPT_NOPROGRESS, false); 
    curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback_progress'); 
    
  3. 핸들 진행

    $cancelled = false; //cancel flag 
    
    function callback_progress($download_size, $downloaded, $upload_size, $uploaded){ 
    
        //Really need this, if not connection_aborted() never be true and curl still running even if script aborted 
        print " "; ob_flush(); flush(); 
    
        if(connection_aborted()!= 0){ 
         if(!$cancelled) $cancelled = true; 
         return 0; //to continue script, and handle later 
        } 
    } 
    
  4. 은 작동하지 않을 것,

    curl_close($ch); //close curl 
    ini_set('ignore_user_abort', FALSE); //set back to false 
    
    //If $cancelled if true, make delete call to file server using the file id 
    if($cancelled && isset($response['id'])) return $this->removeFile($response['id']); 
    

를 진행하지만. $cancelled은 여전히 ​​거짓이지만 아직 callback_progress 기능에서는 true입니다.

더 좋은 방법이 있나요? 이 상황에서는 어디서나 올바른 솔루션을 찾을 수 없습니다.

답변

0

나는이에 대한 첫 번째 호출하기 전에 실행 한 $cancelled 변수의 경우 당신이 의지 를 확실히했던에 넣어 removeFile 방법은 당신의 진행 함수의 호출 스크립트의 부분에서로 사용할 수없는 호출 믿습니다 callback_progress가 작성됩니다.

$cancelledrequest['id']이 callback_progress 내에 있는지 확인하십시오. 이 경우 $cancelled이 참일 때 함수를 실행해야합니다.

관련 문제