我正在使用 CakePHP 框架(v2.x)编写一个 PHP 网页应用程序。在我的一个视图中,有一个表单,可以将大型视频文件上传到第三方 API。这些文件很大,所以上传可能需要一两分钟的时间。因此,我使用 AJAX 提交表单,并向用户显示跳舞的河马(或其他东西),以便他们知道进度仍在进行中。以下是使用 jquery form plugin 的该脚本:
为了不向客户端公开我们的API密钥,我将表单提交到一个控制器操作,该操作使用curl从服务器实际向API进行POST请求。这是该方法(以及一个回调函数)。
这个可以工作,但如果我能向用户展示上传的实际进度,那将会更好。我已经想出如何通过回调函数计算进度(见***注释B***),但我不确定如何将其传递回页面(用户正在等待的页面)。我尝试使用jQuery的
如何捕获curl进度和后续API响应?
<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密钥,我将表单提交到一个控制器操作,该操作使用curl从服务器实际向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***
}
这个可以工作,但如果我能向用户展示上传的实际进度,那将会更好。我已经想出如何通过回调函数计算进度(见***注释B***),但我不确定如何将其传递回页面(用户正在等待的页面)。我尝试使用jQuery的
uploadProgress
,但它显示的是文件上传到我们服务器的进度...而不是上传到API的进度。我尝试从curl回调中回显进度(***注释B***),但它会输出一系列数字,与API返回的JSON对象(***注释A***)纠缠在一起,而我也需要该JSON对象。类似于这样:11112222233344444...9898989899999999999999{api:"response mixed in here"}100100100100
如何捕获curl进度和后续API响应?