通过PHP API上传个人资料图片

时间:2013-09-06 20:59:37

标签: php image profile desire2learn valence

我无法为用户上传个人资料照片。我一直收到404错误,API文档告诉我这个错误表明无法找到配置文件。但是,在我将在一秒钟内显示的代码之上,我有代码来检索配置文件,它确实存在于我正在使用的特定userId。此外:

  • 这是PHP SDK
  • 我以前用于身份验证的帐户有权修改用户个人资料
  • 我正在使用的测试图像确实存在,我能够阅读它

这是我的代码。这有点草率,但是一旦我为这个特定的测试用户做了这个,我就会把它清理干净:

$file = "testimage.jpeg";
$image_data = file_get_contents($file);

// Build our data
$uid = uniqid();
$data = "--" . $uid . "\r\n".
    "Content-Disposition: form-data; name=\"profileImage\"; filename=\"profileImage.jpeg\"\r\n".
    "Content-Type: image/jpeg\r\n".
    "\r\n".
    $image_data . "\r\n".
    "--" . $uid . "--";

$success = false;
$tryAgain = true;
$numAttempts = 1;
$url = "/d2l/api/lp/1.0/profile/user/".$userId."/image";
$uri = $opContext->createAuthenticatedUri($url, "POST");
curl_setopt($ch, CURLOPT_URL, $uri);
while ($tryAgain && $numAttempts < MAX_NUM_ATTEMPTS) {
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Disposition: multipart/form-data; boundary='.$uid,
        'Content-Length: ' . strlen($data))
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $response = curl_exec($ch);
    $httpCode  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    $responseCode = $opContext->handleResult($response, $httpCode, $contentType);
    if ($responseCode == D2LUserContext::RESULT_OKAY) {
        $success = true;
        $tryAgain = false;
    }
    elseif ($responseCode == D2LUserContext::RESULT_INVALID_TIMESTAMP) {
        // Try again since time skew should now be fixed.
        $tryAgain = true;
    }
    else {      // Something bad happened
        echo "here:\r\n".
            $httpCode.
            "\r\n\r\n".
            $responseCode;
        exit;
    }
    $numAttempts++;
}

我不知道自己错过了什么。任何建议将不胜感激。感谢

编辑:我刚刚注意到API文档中的这一部分:

  

请注意

     

为了使用此操作,服务必须已授予应用程序特定权限(即,授予特定应用程序ID和密钥的权限以尝试此操作)。

我会询问我们的应用ID /密钥是否确实有权限。我以为它确实如此,但也许我得到的信息不正确。我会询问这个。

1 个答案:

答案 0 :(得分:1)

这是我使用的功能。我使用PHP Api获取用户上下文对象,并通过curl完成剩下的工作。

$ opContext - 来自PHP API

$ user_id - 来自d2l

$ filename - 服务器上的图像文件名

$ filepath - 服务器上文件的路径(我有不同地方的教师和学生)

$ filetype - 用于mimetype

static function set_user_image($opContext,$user_id,$filename,$filepath,$filetype){
    $fp = fopen($filepath.$filename, 'r');
    $contents = fread($fp, filesize($filepath.$filename));
    fclose($fp);
    $random_hash = "xxBOUNDARYxx";
    $request ="--".$random_hash."\r\nContent-Type: application/json\r\n\r\n{\"Text\":\"Some comment\", \"HTML\":null}\r\n\r\n--".
                   $random_hash."\r\nContent-Disposition: form-data; name=\"profileimage\"; filename="."\"$filename\""."\r\nContent-Type: image/$filetype\r\n\r\n".
                   $contents."\r\n\r\n--".$random_hash;

    $length=strlen($request);
    $url = $opContext->createAuthenticatedUri("/d2l/api/lp/1.1/profile/user/$user_id/image","POST");

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("HTTP/1.1", "Content-Type: multipart/form-data; boundary=xxBOUNDARYxx","Content-Length:".$length));
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST,true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    $response = curl_exec($ch);             
}