PHP cURL发送和接收图像客户端/服务器

时间:2010-11-18 23:09:06

标签: php image curl binary file-transfer

我一直在研究这个问题并且没有找到答案。

我有一个客户端网站调用我们的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文件从服务器到客户端不是一个好的选择。

谢谢

1 个答案:

答案 0 :(得分:0)

这不是一项微不足道的任务。但是,您应该能够设计出成功的方法。但是,这不是完成任务的最错误安全的方法。您现在正在考虑一种HTTP-esque无状态协议,它是可管理的。如果下面的描述听起来不够好,请考虑另一个可以保持双向连接的协议(如SSH隧道)。

您可能会遇到数据开销,但为了节省多个呼叫,这通常会超出可接受范围。为此,我建议创建一个XML接口。在接收端,您的XML将具有一个元素,该元素具有图像的Base64表示,或者可能是一个gzip压缩的CDATA实现。您不必遵守任何XML标准,但如果您这样做,PHP XML Parser可以帮助您完成一些工作。

因此,回顾一下,在这个模型中,服务器端可以接收一组执行您调用的命令:将文件移动到处理文件夹,创建文件内容的Base64字符串,制作XMl包裹,并将其归还。客户端将发送请求,并处理响应。如果客户端检测到错误,则可以重试,服务器仍然可以从处理队列中获取文件数据。

如果错误成为问题并且打开套接字不是一个好选择(因为编码很困难),您还可以开发一个删除批处理系统,您可以在其中跟踪处理文件夹中的文件并仅删除它们请求。但是,您只需要偶尔从客户端发出删除请求,并且可能不是具有用户体验的任何特定页面的一部分,而是来自cron。