我一直在研究这个问题并且没有找到答案。
我有一个客户端网站调用我们的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 :(得分:0)
这不是一项微不足道的任务。但是,您应该能够设计出成功的方法。但是,这不是完成任务的最错误安全的方法。您现在正在考虑一种HTTP-esque无状态协议,它是可管理的。如果下面的描述听起来不够好,请考虑另一个可以保持双向连接的协议(如SSH隧道)。
您可能会遇到数据开销,但为了节省多个呼叫,这通常会超出可接受范围。为此,我建议创建一个XML接口。在接收端,您的XML将具有一个元素,该元素具有图像的Base64表示,或者可能是一个gzip压缩的CDATA实现。您不必遵守任何XML标准,但如果您这样做,PHP XML Parser可以帮助您完成一些工作。
因此,回顾一下,在这个模型中,服务器端可以接收一组执行您调用的命令:将文件移动到处理文件夹,创建文件内容的Base64字符串,制作XMl包裹,并将其归还。客户端将发送请求,并处理响应。如果客户端检测到错误,则可以重试,服务器仍然可以从处理队列中获取文件数据。
如果错误成为问题并且打开套接字不是一个好选择(因为编码很困难),您还可以开发一个删除批处理系统,您可以在其中跟踪处理文件夹中的文件并仅删除它们请求。但是,您只需要偶尔从客户端发出删除请求,并且可能不是具有用户体验的任何特定页面的一部分,而是来自cron。