2013-09-06 4 views
1

사용자의 프로필 사진을 업로드하는 데 문제가 있습니다. API 문서에서 알 수있는 404 오류가 계속 발생하여 프로필을 찾을 수 없다고 표시됩니다. 그러나 초 단위로 표시 할 코드 위에 프로파일을 검색하는 코드가 있으며 사용중인 특정 userId에 대한 코드가 존재합니다. 또한 :PHP API를 통해 프로필 사진 업로드

  • 이것은 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

다음은 내가 사용하는 기능입니다. 나는 PHP Api를 사용하여 사용자 컨텍스트 객체를 얻고 나머지는 컬을 통해 수행한다.

$ opContext - PHP는 API

$ USER_ID에서 - D2L에서

$ 파일 이름 - 서버에있는 이미지 파일 이름

$ 파일 경로 - 서버에서 파일에 경로 (나는 교수진과 학생들이 다른 장소)

$ 파일 형식 - MIME 형식

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);    
} 
+0

감사에 대한 당신이 아주 많이. 이것은 나를 위해 일했다. 나는 여전히 코드를 잘못 이해하고 비교하려고 노력하고 있지만 (앞으로의 작업에 대한 내 자신의 이해를 위해서), 그렇지만 이것은 매력처럼 작동한다. 무리 감사. –

+0

좋아요! 나는 그것이 당신을 위해 일해서 다행입니다. 나는 D2L API를위한 내 자신의 래퍼 라이브러리를 작성하는 것이 많은 경우에 도움이되었다는 것을 발견했다. – Johnnygizmo

+0

동의 - 내 자신의 내부 작업과 테스트를 수행하기 위해 내가했던 첫 번째 작업 중 하나는 D2L Python SDK에 대한 래퍼 세트를 작성하는 것이 었습니다. 특히 까다로운 작업과 같이 많은 도움이되었습니다. 바이너리 데이터 업로드. –