2010-11-18 110 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。

相关问题