2010-11-18 140 views
1

我一直在研究這一段時間,並沒有找到答案。PHP cURL發送和接收圖像客戶端/服務器

我有一個客戶站點調用我們的API服務器。我想在特殊電話發送時將圖像傳送到客戶網站。

我有一些代碼從服務器上下載圖像,但是這導致我們進行多次調用,迫使我們在服務器中創建所有這些圖像,我們不想保留,即使我們之後刪除它們。

 


$originalFileUrl = createImage('createImage', $fileName); 
downloadImage($originalFileUrl, $fileDestination); 
deleteFileFromServer('deleteImage', $fileName); 


function serverCall ($action, $fileName) { 

     $serverCall = $SERVER.'/api.php?fileName=' . $fileName . '&action=' . $action; 

     ob_start(); 
     $ch = curl_init(); 
     $timeout = 5; 

     curl_setopt ($ch, CURLOPT_URL, $serverCall); 
     curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0); 
     curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     curl_exec($ch); 

     $fileContents = ob_get_contents(); 

     curl_close($ch); 
     ob_end_clean(); 

     return $fileContents; 
} 

function downloadImage ($originalFileUrl, $fileDestination) {  
     // Starting output buffering 
     ob_start(); 

     // create a new CURL resource 
     $ch = curl_init(); 

     // set URL and other appropriate options 
     curl_setopt($ch, CURLOPT_URL, $originalFileUrl); 
     curl_setopt($ch, CURLOPT_HEADER, false); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

     // set timeouts 
     set_time_limit(30);      // set time in secods for PHP 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); // and also for CURL 

     // open a stream for writing 
     $outFile = fopen($fileDestination, 'wb'); 

     curl_setopt($ch, CURLOPT_FILE, $outFile); 

     // grab file from URL 
     curl_exec($ch); 
     fclose($outFile); 

     // close CURL resource, and free up system resources 
     curl_close($ch); 
     ob_end_clean(); 
} 
 

其中$ originalFileUrl是文件的當前位置,並且$ fileDestination是路徑,我想我的新的文件是。

我的問題是:我可以打電話給服務器中的一個PHP文件,負責在一次調用中創建,傳輸和刪除圖像,而不是多次調用嗎?

也出於多種原因ftp文件從服務器到客戶端不是一個好的選擇。

謝謝

回答

0

這會不會是一個簡單的任務。但是,你應該能夠設計一個成功的方法。不過,這不會是完成任務最安全的方法。您現在正在考慮可以管理的HTTP-esque無狀態協議。如果下面的描述聽起來不夠好,請考慮另一個可以保持恆定雙向連接的協議(如SSH隧道)。

您可能會承受數據開銷,但這通常會超過可接受的水平以保存多個呼叫。爲此,我建議創建一個XML接口。在接收端,您的XML將包含一個具有圖像的Base64表示的元素,或者可能是gzip CDATA實現。您不必遵守任何XML標準,但是如果您這樣做,PHP XML Parser可以幫助您完成某些工作。

因此,回顧一下,在這個模型中,服務器端可以接收一組命令,它們可以完成所謂的命令:將文件移動到一個處理文件夾中,創建一個Base64字符串的文件內容, XMl包,並返回它。客戶端將發送請求並處理響應。如果客戶端檢測到錯誤,它可能會重試,服務器仍然可以從處理隊列中獲取文件數據。

如果錯誤成爲問題,並且打開的套接字不是一個好選擇(因爲編碼很困難),您還可以開發一個刪除批處理系統,您可以在其中跟蹤處理文件夾中的文件並只刪除它們根據要求。但是,你只能偶爾從客戶端發出刪除請求,而不是作爲具有用戶體驗的任何特定頁面的一部分,而不是來自cron。

相關問題