2010-11-18 40 views
1

J'ai fait des recherches sur ce sujet depuis un certain temps et je n'ai pas trouvé de réponse pour cela.PHP cURL envoyer et recevoir des images Client/Serveur

J'ai un site client qui appelle votre serveur API. Ce que je voudrais transférer une image sur le site client lors d'un appel spécial. J'ai un code qui télécharge l'image à partir du serveur, mais cela nous amène à faire plusieurs appels nous forçant à créer toutes ces images dans le serveur que nous ne voulons pas conserver, même si nous les supprimons par la suite .

 


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

Où $ originalFileUrl est l'emplacement actuel du fichier, et fileDestination $ est le chemin où je veux que mon nouveau fichier soit.

Ma question est: Puis-je faire un appel à un fichier PHP dans le serveur qui sera chargé de créer, transférer et supprimer l'image tout en un appel plutôt que de faire plusieurs appels?

Aussi pour plusieurs raisons ftp le fichier du serveur au client n'est pas une bonne option.

Merci

Répondre

0

Ce ne sera pas une tâche triviale. Cependant, vous devriez être capable de concevoir une approche réussie. Cependant, ce ne sera pas la méthode la plus sûre d'accomplir la tâche. Vous pensez en ce moment à un protocole HTTP-esque sans état, qui est gérable. Si la description ci-dessous ne sonne pas assez bien, considérez un autre protocole qui peut maintenir une connexion bidirectionnelle constante (comme un tunnel SSH).

Vous risquez de subir un surdébit de données, mais ce serait généralement plus qu'acceptable pour enregistrer plusieurs appels. À cette fin, je conseillerais de créer une interface XML. Du côté de la réception, votre XML aurait un élément avec soit une représentation Base64 de l'image, soit éventuellement une implémentation CDATA gzippée. Vous n'avez pas besoin de vous en tenir à un standard XML, mais si vous le faites, le PHP XML Parser pourrait vous aider dans le processus. Donc, pour récapituler, dans ce modèle, la fin du serveur pourrait recevoir un ensemble de commandes qui font ce que vous avez appelé: déplacer le fichier dans un dossier de traitement, créer une chaîne Base64 du contenu du fichier, créer le XMl, et le renvoyer. Le client enverra une demande et traitera la réponse. Si le client détecte une erreur, il peut réessayer et le serveur peut toujours récupérer les données du fichier à partir de la file d'attente de traitement.

Si une erreur survient et qu'une socket ouverte n'est pas une bonne option (car le codage est difficile), vous pouvez également développer un système de suppression par lot, où vous suivez les fichiers dans le dossier de traitement et ne les supprimez sur demande. Mais, vous ne feriez que supprimer des requêtes du client de temps en temps, et peut-être pas dans le cadre d'une page particulière avec une expérience utilisateur, mais à partir d'un cron.