2010-11-18 6 views
1

저는 잠시 동안 이것을 연구 해왔고 이에 대한 답을 찾지 못했습니다.PHP cURL 이미지 송수신 클라이언트/서버

API 서버를 호출하는 클라이언트 사이트가 있습니다. 특별한 전화가 걸려 올 때 이미지를 클라이언트 사이트로 전송하고 싶습니다.

서버에서 이미지를 다운로드하는 몇 가지 코드가 있지만 이로 인해 이후에 이미지를 삭제하더라도 보관하지 않으려는 이미지가 서버에 여러 번 생성 될 수 있습니다 . $ originalFileUrl 현재 파일의 위치 및 $ fileDestination입니다

 


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

내가 내 새 파일이 원하는 위치로 경로입니다.

제 질문은 서버에서 여러 번 호출하는 대신 이미지를 만들고, 전송하고, 삭제하는 PHP 파일을 호출 할 수 있습니까?

또한 여러 가지 이유로 ftp 서버에서 클라이언트로 파일을 좋은 옵션이 아닙니다.

고맙습니다.

답변

0

이것은 간단한 작업이 아닙니다. 그러나 성공적인 접근 방식을 설계 할 수 있어야합니다. 그러나이 작업을 수행하는 가장 오류가없는 방법은 아닙니다. 당신은 지금 관리가 가능한 HTTP-esque stateless 프로토콜을 생각하고 있습니다. 아래의 설명이 충분하지 않다고 생각되면 일정한 양방향 연결 (예 : SSH 터널)을 유지할 수있는 다른 프로토콜을 고려하십시오.

데이터 오버 헤드가 발생할 수 있지만 일반적으로 여러 통화를 저장하기 위해 허용되는 것보다 많습니다. 이를 위해 XML 인터페이스를 만드는 것이 좋습니다. 수신 측에서는 XML이 이미지의 Base64 표현 또는 gzipped CDATA 구현을 가진 요소를 갖습니다. XML 표준을 고수 할 필요는 없습니다. 그렇다면 PHP XML Parser이 도움이 될 수 있습니다.

그래서이 모델에서 서버 끝은 내가 부른 것을 처리하는 일련의 명령을받을 수 있습니다. 파일을 처리 폴더로 이동하고 파일 내용의 Base64 문자열을 생성하고 XMl 패키지를 만들고 그것을 반환하십시오. 클라이언트는 요청을 보내고 응답을 처리합니다. 클라이언트가 오류를 발견하면 다시 시도 할 수 있으며 서버는 여전히 처리 대기열에서 파일 데이터를 가져올 수 있습니다.

코딩이 어렵 기 때문에 오류가 문제가되고 열린 소켓이 적합하지 않은 경우 처리 폴더의 파일을 추적하여 삭제 만하는 삭제 일괄 처리 시스템을 개발할 수도 있습니다 요청시. 그러나 클라이언트에서 삭제 요청을 할 때마다 한 번씩, 그리고 아마도 사용자 경험이있는 특정 페이지의 일부가 아닌 cron에서 삭제 요청을 할 수 있습니다.