2012-03-23 3 views
1

다음 코드는 메타 데이터가 포함 된 이미지를 Picasa 웹 앨범에 업로드하려고 시도하고 있습니다.메타 데이터가있는 사진을 Picasa에 업로드하려고 할 때 'Multipart에 Atom 및 미디어 부분이 있어야 함'오류가 발생합니다.

아래의 코드는 메타 데이터를 가져 와서 콘텐츠 유형 : image/jpeg POST 요청을하면 이미지를 업로드하는 데 적합합니다.

$albumUrl = "https://picasaweb.google.com/data/feed/api/user/$userId/albumid/$albumId"; 
$imgName = $_SERVER['DOCUMENT_ROOT'] . '/picasa/cute_baby_kitten.jpg'; 

$rawImgXml = '<entry xmlns="http://www.w3.org/2005/Atom"> 
       <title>plz-to-love-realcat.jpg</title> 
       <summary>Real cat wants attention too.</summary> 
       <category scheme="http://schemas.google.com/g/2005#kind" 
       term="http://schemas.google.com/photos/2007#photo"/> 
      </entry>'; 

$fileSize = filesize($imgName); 
$fh = fopen($imgName, 'rb'); 
$imgData = fread($fh, $fileSize); 
fclose($fh); 

$dataLength = strlen($rawImgXml) + $fileSize; 
$data = ""; 
$data .= "\nMedia multipart posting\n"; 
$data .= "--P4CpLdIHZpYqNn7\n"; 
$data .= "Content-Type: application/atom+xml\n\n"; 
$data .= $rawImgXml . "\n"; 
$data .= "--P4CpLdIHZpYqNn7\n"; 
$data .= "Content-Type: image/jpeg\n\n"; 
$data .= $imgData . "\n"; 
$data .= "--P4CpLdIHZpYqNn7--"; 

$header = array('GData-Version: 2', $authHeader, 'Content-Type: multipart/related;boundary=P4CpLdIHZpYqNn7', 'Content-Length: ' . $dataLength, 'MIME-version: 1.0'); 

$ret = ""; 
$ch = curl_init($albumUrl); 
$options = array(
     CURLOPT_SSL_VERIFYPEER=> false, 
     CURLOPT_POST=> true, 
     CURLOPT_RETURNTRANSFER=> true, 
     CURLOPT_HEADER=> true, 
     CURLOPT_FOLLOWLOCATION=> true, 
     CURLOPT_POSTFIELDS=> $data, 
     CURLOPT_HTTPHEADER=> $header 
    ); 
curl_setopt_array($ch, $options); 
$ret = curl_exec($ch); 
curl_close($ch); 

문제

내가 400 Bad Request: Multipart must have Atom and media part 오류 메시지가 다시 점점 계속 것입니다.

Array 
(
    [0] => GData-Version: 2 
    [1] => Authorization: GoogleLogin auth="THISISAVALIDAUTHCODE" 
    [2] => Content-Type: multipart/related;boundary=P4CpLdIHZpYqNn7 
    [3] => Content-Length: 179951 
    [4] => MIME-version: 1.0 
) 

을 그리고 여기처럼 POST 요청 본문 보이는 내용은 다음과 같습니다 : 나는 라인이 제대로 POST 본문에 배치 나누기 생각

Media multipart posting 
--P4CpLdIHZpYqNn7 
Content-Type: application/atom+xml 

<entry xmlns="http://www.w3.org/2005/Atom"> 
       <title>plz-to-love-realcat.jpg</title> 
       <summary>Real cat wants attention too.</summary> 
       <category scheme="http://schemas.google.com/g/2005#kind" 
       term="http://schemas.google.com/photos/2007#photo"/> 
      </entry> 
--P4CpLdIHZpYqNn7 
Content-Type: image/jpeg 

IMAGE DATA GOES HERE 
--P4CpLdIHZpYqNn7-- 

여기

는 헤더 내가 보내고있다 있습니다 하지만 나는 100 % 확실하지 않습니다. 나는 또한 정확하게 Content-Length을 계산했는지 궁금합니다.

내가 뭘 잘못하고 있니?

답변

0

그래서 이고 Content-Length에는 문제가있는 것으로 나타났습니다.

YouTube API docs에서이 작은 발췌문이 해결되었습니다.

올바른 Content-Length를 계산하려면 POST 요청의 전체 문자열 길이를 계산해야합니다. 그러나 XML 구성 요소와 파일 2 진 이외에도 직접 업로드 요청은 요청의 여러 부분을 구분하는 경계 문자열을 정의합니다. 따라서 XML과 파일 바이너리뿐만 아니라 삽입 된 경계 문자열과 개행 문자의 크기도 계산해야합니다..

나는 Content-Length을 이진 이미지 데이터와 XML의 길이의 합계로 설정했습니다. 줄 바꿈이나 경계 마커를 계산하지 않았습니다.

그래서

'Content-Length: ' . $dataLength 

요구 사항이 비트는

'Content-Length: ' . strlen($data) 
로 변경