CakePHP 프레임 워크 (v2.x)를 사용하여 PHP 웹 앱을 작성하고 있습니다. 내 견해 중 하나에는 큰 동영상 파일을 타사 API에 업로드하는 형식이 있습니다. 파일이 크기 때문에 업로드하는 데 1-2 분 정도 걸릴 수 있습니다. 그래서 AJAX로 양식을 제출하고 사용자에게 춤추는 하마 (또는 무엇이든)를 보여주기 때문에 바퀴가 여전히 돌아가고 있음을 알게됩니다. 여기에 jquery form plugin 사용하는 스크립트입니다 : 클라이언트에 우리의 API 키를 노출시키지하기 위해AJAX로 PHP 컬 진행 상황을 표시하는 방법
<script>
var options = {
//complete : callback_function...,
//error : callback_function...,
beforeSend : function() {
$("#MediaSubmitForm").hide();
$("#MediaSubmitForm").after('<img class="hula-hippo" src="/img/hippo-hula.gif" />');
},
success : function(data){
$(".hula-hippo").hide();
$("#MediaSubmitForm").after("<h3>Upload complete!</h3>");
console.log(data);
},
uploadProgress: function(event, position, total, percentComplete){
console.log(percentComplete);
}
};
$("#MediaSubmitForm").ajaxForm(options);
</script>
가, 내가 사용하는 API에 대한 서버의 실제 POST 요청을 만드는 컨트롤러 액션에 양식을 제출 컬. 이 메소드 (그리고 하나의 콜백)가있다.
//uploads a video to a project through the API
public function apiUpload($tmp_filename, $project_hashed_id) {
$api_password = 'xxxxxxxxxx';
$username = 'api';
$data = array(
'api_password' => $api_password,
'file' => '@'.$tmp_filename,
'project_id' => $project_hashed_id
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, "https://upload.wistia.com");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, array($this, 'apiUploadCallback'));
$result = curl_exec($ch); //***Note A***
curl_close($ch);
return(json_decode($result));
}
//BE CAREFUL... PHP 5.5 Added the cURL resource as the first argument to the CURLOPT_PROGRESSFUNCTION callback
protected function apiUploadCallback($total_bytes_down_expected, $bytes_down_so_far, $total_bytes_up_expected, $total_bytes_up_so_far) {
if ($total_bytes_up_expected > 0)
//error_log(round(($total_bytes_up_so_far/$total_bytes_up_expected)*100));
echo (round(($total_bytes_up_so_far/$total_bytes_up_expected)*100)); //***Note B***
}
이 작동하지만 사용자에게 업로드의 실제 진행 상황을 보여줄 수 있다면 훨씬 더 좋을 것이다. 콜백 함수 (***Note B***
참조)로 이것을 계산하는 방법을 알아 냈습니다 만, 사용자가 대기중인 페이지로 다시 전달하는 방법을 모르겠습니다. jQuery의 uploadProgress
을 사용해 보았지만 서버에 업로드하는 파일의 진행 상태를 보여줍니다 ... NOT API 업로드 진행 중. 컬 콜백 (***Note B***
)에서 진행 상황을 반향 시키려했지만 API (***Note A***
)가 반환 한 json 객체가 복잡하게 뒤얽힌 일련의 숫자가 나온다. 다음과 같은 내용 :
11112222233344444...9898989899999999999999{api:"response mixed in here"}100100100100
어떻게하면 컬 처리 및 후속 API 응답을 캡처 할 수 있습니까?
진행 상황을 확인하기 위해 다른 아약스 전화를 걸 수 있습니까? timeout을 사용하여 완료 될 때까지 진행률을 반복적으로 폴링합니다. –
그건 재미있는 생각이지만, 당신이 생각하는 것을 더 듣고 싶습니다. 예를 들어 두 곳의 아약스 호출을 두 번 생각하고 있습니까? 또는 동일한 컨트롤러에 두 개의 아약스 호출 ... 첫 번째 진행률을 처리하고 두 번째 json 개체를 찾습니다. – emersonthis
다른 컨트롤러에 두 번 호출 할 생각이 있습니다. (저는 Cake TBH에 익숙하지 않습니다) 세션 변수에 진행 상황을 저장하고 진행이 100 %가 될 때까지 폴링하도록 setTimeout을 사용할 수 있습니다. –