Панель администратора Quickblox в состоянии изображений в разделе содержимого имеет статус Загружен, но предварительное изображение не просматривается, а ссылка AWS (amazons3) не работает.
Шаг 1 — Создайте сеанс с использованием учетной записи quickblox (основной учетной записи) и получите токен сеанса из ответа.
Шаг 2 — Войдите в API пользователя, используя учетные данные пользователя и токен сеанса.
Шаг 3 — Создаем большой двоичный объект и из ответа извлекаем все параметры информации о большом двоичном объекте и создаем массив json.
Шаг 4 — Загружаем пользовательское изображение / аватар и получаем ответ
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
x-amz-id-2: CaF37TJwdt0PZjGdquV4yQSeNqtDyWrZge1DfkBinhNdhHYb635nsWcECFhUoRgiYzuAAxf+z2Q=
x-amz-request-id: F24A002779D03E34
Date: Tue, 21 Mar 2017 13:15:17 GMT
ETag: "3b45dadd80ddb4019e129e1c8469ca40"Location: http://qbprod.s3.amazonaws.com/2e5b9610a6ff4a8395ade21377def2f500
Content-Type: application/xml
Content-Length: 269
Server: AmazonS3
Шаг 5 — Объявленный файл загружен.
Шаг 6 — Связанный идентификатор BLOB-объекта с пользователем API.
Вот мой весь код, скажите мне, что я делаю неправильно:
примечание: учетные данные не являются реальными.
<?php
$quickblox_user_name = "quickblox_agicent"; //quickblox account
$quickblox_password = "quickblox@123";
$user_login = "quickblox_qb_130"; //API
$user_pwd = "21663496";
$profile_pic = "c.png"; // image path
$file_size = filesize($profile_pic);
//CREATE SESSION
$session = createSession($quickblox_user_name,$quickblox_password);
$token = $session->token;
//LOGIN USER
$login_user = loginUser($user_login,$user_pwd,$token);
$login_user_decode = json_decode($login_user);
$log_in = $login_user_decode->user;
$user_id = $log_in->id;
//CREATE A BLOB
$create_blob = createBlob($profile_pic, $token);
$res = json_decode($create_blob)->blob;
$blob_id = $res->id;
$name = $res->name;
$size = $res->size;
$res_en = json_encode($res->blob_object_access);
$rr = json_decode($res_en);
$get_params = $rr->params;
//EXTRACTING BLOB PARAMETER FROM QUERY STRING
$Query_String = explode("&", explode("?", $get_params)[1] );
$content_type = urldecode(substr($Query_String[0], strpos($Query_String[0], "=") + 1));
$expires = urldecode(substr($Query_String[1], strpos($Query_String[1], "=") + 1));
$acl = substr($Query_String[2], strpos($Query_String[2], "=") + 1);
$key = substr($Query_String[3], strpos($Query_String[3], "=") + 1);
$policy = substr($Query_String[4], strpos($Query_String[4], "=") + 1);
$success_action_status = substr($Query_String[5], strpos($Query_String[5], "=") + 1);
$x_amz_algorithm = substr($Query_String[6], strpos($Query_String[6], "=") + 1);
$x_amz_credential = urldecode(substr($Query_String[7], strpos($Query_String[7], "=") + 1));
$x_amz_date = substr($Query_String[8], strpos($Query_String[8], "=") + 1);
$x_amz_signature = substr($Query_String[9], strpos($Query_String[9], "=") + 1);
//CREATE JSON ARRAY OF EXTRATED PARAMETER
$fields = array
(
"Content-Type" => $content_type,
"Expires" => $expires,
"acl" => $acl,
"key" => $key,
"policy" => $policy,
"success_action_status" => $success_action_status,
"x-amz-algorithm" => $x_amz_algorithm,
"x-amz-credential" => $x_amz_credential,
"x-amz-date" => $x_amz_date,
"x-amz-signature" => $x_amz_signature,
"file" => "@".$profile_pic
);
//UPLOAD AVATAR / IMAGE
$upload_avatar = uploadAvatar($fields);
$resPP = json_decode($upload_avatar);
//DECLARE FILE UPLOAD
$declare_upload_avatar = declareUploadAvatar($file_size,$blob_id,$token);
//CONNECT BLOB ID TO API USER
$resultConnect = connectBlobToUser($blob_id,$user_id,$token);//FUNCTIONS
function createSession($login,$pwd)
{
// Application credentials - change to yours (found in QB Dashboard)
DEFINE('APPLICATION_ID', 12345);
DEFINE('AUTH_KEY', "MDJ8979q328");
DEFINE('AUTH_SECRET', 'asDCE-JLDJCEU');
DEFINE("RESETPWD_BASE_URL", strtolower(stristr($_SERVER["SERVER_PROTOCOL"], "/", true)) . "://" . $_SERVER["HTTP_HOST"] ."/img");
// User credentials
DEFINE('USER_LOGIN', $login);
DEFINE('USER_PASSWORD', $pwd);
// Quickblox endpoints
DEFINE('QB_API_ENDPOINT', "https://api.quickblox.com");
DEFINE('QB_PATH_SESSION', "session.json");
// Generate signature
$nonce = rand();
$timestamp = time();
$signature_string = "application_id=".APPLICATION_ID."&auth_key=".AUTH_KEY."&nonce=".$nonce."×tamp=".$timestamp."&user[login]=".USER_LOGIN."&user[password]=".USER_PASSWORD;
$signature = hash_hmac('sha1', $signature_string , AUTH_SECRET);
$post_body = "application_id=" . APPLICATION_ID . "&auth_key=" . AUTH_KEY . "×tamp=" . $timestamp . "&nonce=" . $nonce . "&signature=" . $signature . "&user[login]=" . USER_LOGIN . "&user[password]=" . USER_PASSWORD;
// Configure cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, QB_API_ENDPOINT . '/' . QB_PATH_SESSION); // Full path is - https://api.quickblox.com/session.json
curl_setopt($curl, CURLOPT_POST, true); // Use POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_body); // Setup post body
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Receive server response
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_CAINFO,RESETPWD_BASE_URL."/quickblox.com.crt");
// Execute request and read response
$response = curl_exec($curl);
$responseJSON = json_decode($response);
// Check errors
if ($response)
{
$rs = json_decode($response)->session;
return $rs;
} else {
echo "0";
// $error = curl_error($curl). '(' .curl_errno($curl). ')';
// echo $error . "\n";
}
// Close connection
curl_close($curl);
}
function loginUser($login1,$pwd1,$token)
{
$requestCred = '{"login": "'.$login1.'", "password": "'.$pwd1.'"}';
$ch = curl_init('http://api.quickblox.com/login.json');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestCred);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'QuickBlox-REST-API-Version: 0.1.1',
'QB-Token: ' . $token
));
$res = curl_exec($ch);
curl_close( $ch );
return $res;
}
function createBlob($profile_pic,$token)
{
$ext = pathinfo($profile_pic, PATHINFO_EXTENSION);
if($ext == 'png' || $ext == "Png" || $ext == "PNG")
$request = '{"blob": {"content_type": "image/png", "name": "'.$profile_pic.'", "public": "true"}}';
else
$request = '{"blob": {"content_type": "image/jpeg", "name": "'.$profile_pic.'"}}';
$ch = curl_init('http://api.quickblox.com/blobs.json');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'QuickBlox-REST-API-Version: 0.1.1',
'QB-Token: ' . $token
));
$res = curl_exec($ch);
curl_close( $ch );
return $res;
}
function uploadAvatar($fields)
{
$ch = curl_init('http://qbprod.s3.amazonaws.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
$res = curl_exec($ch);
curl_close( $ch );
return $res;
}
function declareUploadAvatar($file_size,$blob_id,$token)
{
$request_size = '{"blob": {"size": '.$file_size.'}}';
$ch = curl_init("http://api.quickblox.com/blobs/".$blob_id."/complete.json/");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_size );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'QuickBlox-REST-API-Version: 0.1.1',
'QB-Token: ' . $token
));
$res = curl_exec($ch);
curl_close( $ch );
return $res;
}
function connectBlobToUser($blob_id,$user_id,$token)
{
$update_user = '{"user": {"blob_id": '.$blob_id.'}}';
$ch = curl_init("http://api.quickblox.com/users/$user_id.json/");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $update_user );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'QuickBlox-REST-API-Version: 0.1.1',
'QB-Token: ' . $token
));
$res = curl_exec($ch);
curl_close( $ch );
return $res;
}
?>
Перед запросом curl вы должны создать новый объект CURLFile
и использовать его в массиве $ fields.
$file_ext = mime_content_type($profile_pic);
$file_path = realpath($profile_pic);
$curl_file = new CURLFile($file_path, $file_ext, $profile_pic);
$fields = array
(
"Content-Type" => $content_type,
"Expires" => $expires,
"acl" => $acl,
"key" => $key,
"policy" => $policy,
"success_action_status" => $success_action_status,
"x-amz-algorithm" => $x_amz_algorithm,
"x-amz-credential" => $x_amz_credential,
"x-amz-date" => $x_amz_date,
"x-amz-signature" => $x_amz_signature,
"file" => $curl_file
);
Вы можете прочитать о CURLOPT_POSTFIELDS здесь: http://php.net/manual/en/class.curlfile.php
Других решений пока нет …