2010-11-18 5 views
1

Ich habe das schon eine Weile recherchiert und habe dafür keine Antwort gefunden.PHP cURL senden und empfangen Bilder Client/Server

Ich habe eine Client-Site, die Aufrufe an unseren API-Server tätigt. Was möchte ich ein Bild an die Client-Site übertragen, wenn ein spezieller Anruf getätigt wird.

Ich habe Code, der das Bild vom Server herunterlädt, aber dies veranlasst uns, mehrere Aufrufe zu machen, die uns zwingen, all diese Bilder auf dem Server zu erstellen, die wir nicht behalten wollen, selbst wenn wir sie später löschen .

 


$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(); 
} 
 

Wo $ originalFileUrl den aktuellen Speicherort der Datei ist, und fileDestination $ ist der Weg, wo ich meine neue Datei sein wollen.

Meine Frage ist: Kann ich einen Aufruf an eine PHP-Datei auf dem Server, die verantwortlich für erstellen, übertragen und löschen Sie das Bild alle in einem Anruf, anstatt mehrere Anrufe zu machen?

Auch aus mehreren Gründen ftp die Datei vom Server zum Client ist keine gute Option.

Vielen Dank

Antwort

0

Dies wird keine triviale Aufgabe sein. Sie sollten jedoch in der Lage sein, einen erfolgreichen Ansatz zu entwerfen. Dies wird jedoch nicht die fehlerfreieste Methode sein, um die Aufgabe zu erfüllen. Sie denken gerade an ein HTTP-ähnliches Stateless-Protokoll, das überschaubar ist. Wenn die folgende Beschreibung nicht gut genug klingt, sollten Sie ein anderes Protokoll in Erwägung ziehen, das eine konstante bidirektionale Verbindung (wie einen SSH-Tunnel) aufrechterhalten kann.

Sie würden wahrscheinlich Daten Overhead erleiden, aber das wäre in der Regel mehr als akzeptabel, um mehrere Anrufe zu speichern. Zu diesem Zweck würde ich empfehlen, eine XML-Schnittstelle zu erstellen. Auf der Empfängerseite würde Ihr XML-Element ein Element mit einer Base64-Repräsentation des Images oder möglicherweise eine CDAPA-Implementierung mit ZIP-Code enthalten. Sie müssen sich nicht an irgendeinen XML-Standard halten, aber wenn Sie das tun, könnte das PHP XML Parser mit einigen der Beinarbeit helfen.

Also, in diesem Modell könnte das Server-Ende eine Reihe von Befehlen erhalten, die tun, was Sie aufgerufen haben: Verschieben Sie die Datei in einen Verarbeitungsordner, erstellen Sie eine Base64-Zeichenfolge des Dateiinhalts, erstellen Sie die XMl-Paket, und geben Sie es zurück. Der Client sendet eine Anfrage und verarbeitet die Antwort. Wenn der Client einen Fehler feststellt, kann er es erneut versuchen, und der Server kann die Dateidaten weiterhin aus der Verarbeitungswarteschlange abrufen.

Wenn ein Fehler ein Problem wird und ein offener Socket keine gute Option ist (weil die Codierung schwierig ist), könnten Sie auch ein Lösch-Batch-System entwickeln, in dem Sie die Dateien im Verarbeitungsordner verfolgen und nur löschen auf Anfrage. Sie würden jedoch nur gelegentlich Anfragen vom Client senden und möglicherweise nicht als Teil einer bestimmten Seite mit einer Benutzererfahrung, sondern von einem Cron.