2009-11-14 51 views
3

Google代碼託管能夠遠程上傳文件。我一直試圖用PHP編寫一個腳本,將文件上傳到我的帳戶。這是腳本本身:將文件上傳到Google代碼託管與PHP和fsockopen()

<?php 

/* I censored a few details. */ 
$username = '***@gmail.com'; 
$password = '***'; 
$file = 'test.txt'; 
$project = '***'; 
$summary = 'test'; 

$uploadHost = "$project.googlecode.com"; 
$projectUri = '/files'; 
$authToken = base64_encode("$username:$password"); 

define('CRLF',"\r\n"); 

$boundary = "afdljgdfgjidofjgoidjfgoijdfogjsog9054uy54rhh"; 
$fileContents = quoted_printable_encode(file_get_contents($file)); 
$body = array(); 

/* Summary field is required. */ 
$body[] = '--' . $boundary . CRLF . 'Content-Disposition: form-data; name="summary"' . CRLF . 'Content-Length: 4' . CRLF . CRLF . 'test'; 

/* The actual file. */ 
$body[] = '--' . $boundary . CRLF . 'Content-Disposition: form-data; name="filename"; filename="' . $file . '"' . CRLF .'Content-Type: text/plain' . CRLF . 'Content-Length: ' . strlen($fileContents) . CRLF . 'Content-Type: application/octet-stream' . CRLF . CRLF . $fileContents; 

/* The end. */ 
$body[] = '--' . $boundary . '--'; 

$bodyString = implode(CRLF, $body); 
$bodyLength = strlen($bodyString); 

$headers = "POST $projectUri 
Host: $project.googlecode.com 
Authorization: Basic $authToken 
Content-Type: multipart/form-data; boundary=$boundary 
Content-Length: $bodyLength 

"; 

$fp = fsockopen("ssl://$uploadHost", 443, $errno, $errstr); 
if ($fp) 
{ 
fwrite($fp, $headers . $bodyString); 
$response = ''; 
while (!feof($fp)) 
    $response .= fgets($fp, 1024); 
fclose($fp); 
} 

/* For debugging. */ 
header('Content-Type: text/plain'); 
echo $headers.$bodyString; 
echo CRLF . CRLF . CRLF . $response; 

我面臨的問題是服務器響應「411長度要求」。但是,我的標題中有Content-Length。那麼,爲什麼這不起作用呢?

下面是HTTP的實際要求:

POST /files 
Host: ***.googlecode.com 
Authorization: Basic *** 
Content-Type: multipart/form-data; boundary=afdljgdfgjidofjgoidjfgoijdfogjsog9054uy54rhh 
Content-Length: 386 

--afdljgdfgjidofjgoidjfgoijdfogjsog9054uy54rhh 
Content-Disposition: form-data; name="summary" 
Content-Length: 4 

test 
--afdljgdfgjidofjgoidjfgoijdfogjsog9054uy54rhh 
Content-Disposition: form-data; name="filename"; filename="test.txt" 
Content-Type: text/plain 
Content-Length: 8 
Content-Type: application/octet-stream 

testtext 
--afdljgdfgjidofjgoidjfgoijdfogjsog9054uy54rhh-- 

我不明白。

回答

3

HTTP標準要求您指定您正在使用的HTTP協議版本。在你的情況,標題更改爲:

$headers = "POST $projectUri HTTP/1.0 
Host: $project.googlecode.com 
Authorization: Basic $authToken 
Content-Type: multipart/form-data; boundary=$boundary 
Content-Length: $bodyLength 

"; 

我認爲谷歌是假設你正在使用的協議的舊版本(< 1.0),如果你不指定它。