2014-07-06 50 views
1

我正在處理腳本以將文件上傳到http://imagerelay.com。這是我第一次在PHP中使用REST API和cURL。上傳有兩個階段。首先將元數據提交給ImageRelay,其中包含本地文件的文件大小。這將返回一個ID號,用於構建用於上傳塊的URL(使用CLI'split'生成)。但是,當我使用cURL上傳文件時,每個文件都會添加額外的219個字節。我懷疑這與cURL的工作方式有關,但我不知道如何在不手動增加階段1中的文件大小的情況下糾正超齡,減少219個字節* x個數據塊。PHP Curl upload_content_length大於文件大小

這是從cURL請求接收到的響應數組。實際的文件塊大小爲1M(1,048,576字節),而響應顯示219個字節在1048795

[http_code] => 201 
[header_size] => 583 
[request_size] => 346 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 2.039208 
[namelookup_time] => 1.2E-5 
[connect_time] => 0.040014 
[pretransfer_time] => 0.13825 
[size_upload] => 1048795 
[size_download] => 1 
[speed_download] => 0 
[speed_upload] => 514314 
[download_content_length] => 1 
[upload_content_length] => 1048795 
[starttransfer_time] => 0.182222 

更下面的代碼的相關部分。 $file表示塊,並且$resource是預定的,因爲它增加了每個塊。

$ch = curl_init($resource); 
curl_setopt($ch, CURLOPT_POST, true); 
$pdfData = array('file' => new CurlFile("file-chunks/{$file}", 'application/octet-stream')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$response = curl_exec($ch); 

我很感激任何可以提供的幫助。我一直在爲此工作一個星期,並在互聯網上搜索,但我無法弄清楚爲什麼大塊的文件大小不匹配upload_content_lengthsize_upload。使用curl在命令行上執行此操作時(而不是CLI上的PHP),我沒有同樣的問題。謝謝!

[編輯]在第一個句子(意外貼!)[/編輯]刪除錯字 [EDIT2]新增賞金[/編輯]

+0

HTTP multipart/form-data在表單字段和文件上傳(它在內容之前有一種迷你標頭)以及它添加的邊界字節時確實有一些額外的開銷。我沒有檢查,但也許cURL包括所有的數量。你知道發送到另一端的文件的實際大小嗎?如果沒有,請嘗試將您的代碼上傳到您自己的PHP腳本中,或者如果可以,請設置一個攔截代理以查看究竟發送了什麼。 – zinga

+0

Zinga,這是我收到的最好的反饋。我希望你能用一個例子來發表回覆,而不是反饋,我會給你賞金。仍然有3個小時,如果你能做到的話。 –

回答

0

嘗試發送文件,這樣

$headers = array(
    'Content-Type: multipart/form-data' 
); 

$file = "/full/path/to/file.pdf"; // Full path to file 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
$result = curl_exec($ch); 
curl_close($ch); 
+0

圖像中繼API說明必須將Content-Type設置爲application/octet-stream。你認爲這是問題嗎? –

0

嘗試使用選項CURLOPT_VERBOSE並檢查STDERR以查看完整的有效負載。

您也可以嘗試使用WireShark來檢查線路上的情況。 (它可能起初很嚇人,但使用起來很簡單)。