PHP cURL отправка и получение изображений клиент / сервер - PullRequest
1 голос
/ 19 ноября 2010

Я изучал это некоторое время и не нашел ответа на это.

У меня есть сайт клиента, который звонит на наш сервер 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 голосов
/ 19 ноября 2010

Это не будет тривиальной задачей. Тем не менее, вы должны быть в состоянии разработать успешный подход. Это не самый безопасный метод решения этой задачи. Вы сейчас думаете о HTTP-протоколе без сохранения состояния, который является управляемым. Если приведенное ниже описание не звучит достаточно хорошо, рассмотрите другой протокол, который может поддерживать постоянное двунаправленное соединение (например, туннель SSH).

Скорее всего, вы столкнетесь с перегрузкой данных, но, как правило, это будет более чем приемлемо для сохранения нескольких вызовов. Для этого я бы посоветовал создать интерфейс XML. На приемном конце ваш XML будет иметь элемент с представлением образа в Base64 или, возможно, с использованием сжатой реализации CDATA. Вам не нужно придерживаться какого-либо стандарта XML, но если вы это сделаете, PHP XML Parser может помочь с некоторыми трудностями.

Итак, скажем, в этой модели серверная часть может получить набор команд, которые делают то, что вы вызывали: переместить файл в папку обработки, создать строку Base64 содержимого файла, создать XMl пакет и вернуть его. Клиент отправит запрос и обработает ответ. Если клиент обнаружит ошибку, он может повторить попытку, и сервер все равно сможет получить данные файла из очереди обработки.

Если ошибка становится проблемой, и открытый сокет не является хорошим вариантом (поскольку кодирование затруднено), вы также можете разработать систему пакетного удаления, где вы отслеживаете файлы в папке обработки и удаляете их только в запрос. Но вы бы делали запросы на удаление от клиента время от времени, и, возможно, не как часть какой-то конкретной страницы с пользовательским интерфейсом, а из cron.

...