Рубрика «PHP»

Определение даты создания изображения

Открыв любой JPEG-файл, можно обнаружить, что среди бинарных данных дата записывается в текстовом формате, например, 2008:08:06 22:32:05. Таким образом, для определения даты создания или редактирования JPEG-файла достаточно открыть его и найти дату при помощи регулярного выражения:

<?php
  $filename = 'flowers.jpg';
  // Помещаем содержимое файла в переменную $content
  $content = file_get_contents($filename);
  // Извлекаем дату
  preg_match('|([\d]{4}:[\d]{2}:[\d]{2} [\d]{2}:[\d]{2}:[\d]{2})|i', $content, $out);
  echo $out[0];
?>

Как отправить файл на сервер (продолжение)

В одной из предыдущих заметок я рассматривал способ отправки файла с одного сервера на другой. Используя сокеты, мы отправляли POST-запрос с сервера first.com на сервер second.com. Но данный способ работает для относительно небольших файлов (примерно до 2-х мегабайт, для получения более точного значения необходимо смотреть в настройках PHP максимальный объем принимаемых данных методом POST).

Чтобы обойти это ограничение, будем передавать файл методом PUT, используя библиотеку CURL. Для этого мы должны инициализировать сеанс CURL, задать для сеанса необходимые параметры, выполнить запрос CURL и закрыть сеанс.

<?php
// Задаем скрипт на сайте second.com, который примет наш запрос и обработает его
$url = 'http://second.com/getfile.php';

// Файл, который мы хотим передать сайту second.com
$file = 'pricelist.csv';

// Узнаем размер передаваемого файла
$filesize = filesize($file);

// Узнаем имя файла (в случае, если в $file указан полный путь до файла)
$pathinfo = pathinfo($file);
$filename = $pathinfo['basename'];

// Открываем передаваемый файл на чтение для дальнейшей его передачи
$fp = fopen($file, 'r');

// Инициализируем сеанс CURL
$ch = curl_init();

// Задаем параметры для открытого сеанса CURL

// Указываем URL скрипта, который примет наш запрос. К имени скрипта
// добавляем переменную, содержащую имя передаваемого файла
curl_setopt($ch, CURLOPT_URL, $url . '?filename=' . $filename);

// Указываем файл (а вернее дескриптор открытого на чтение файла),
// который собираемся передать
curl_setopt($ch, CURLOPT_INFILE, $fp);

// Указываем размер отправляемого файла
curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);

// Указываем, что файл передается методом PUT
curl_setopt($ch, CURLOPT_PUT, 1);

// Указываем, что будет производиться закачка на удаленный сервер
curl_setopt($ch, CURLOPT_UPLOAD, 1);

// Выполняем запрос CURL
curl_exec($ch);

// Завершаем сеанс CURL
curl_close($ch);
?>

После выполнения этого скрипта с сайта first.com на сайт second.com уйдет PUT-запрос, в котором будет находится содержимое передаваемого файла, а в переменной GET['filename'] будет содержаться название передаваемого файла.

Далее нам необходимо организовать прием файла на сайте second.com. Для этого в скрипте getfile.php, находящегося на сайте second.com, из массива $_GET мы должны получить название файла, а из входного потока — содержимое файла:

<?php
// Определяем имя файла; если не определено, задаем как unknow.dat
$filename = (isset($_GET['filename'])) ? $_GET['filename'] : 'unknow.dat';
// Получаем содержимое входящего потока
$content = file_get_contents('php://input');
// Записываем содержимое потока в файл
$file = fopen($filename, 'w+');
fwrite($file, $content);
fclose($file);
echo '<p>Файл получен</p>';
?>

Ссылки по теме:

Масштабирование изображений

Задача масштабирования изображений очень часто встает при разработке Web-приложений, например, при создании фотогалереи, когда необходимо создавать копии изображений маленького размера, предназначенные для предварительного просмотра, или на форуме, для ограничения добавляемой посетителем фотографии.

Итак, пусть у нас есть файл в любом поддерживаемом GD формате, и мы хотим создать “превьюшку” заданного размера в формате JPEG. Разработаем для этой цели функцию img_resize(). Код функции содержит подробные комментарии - так что чтение не должно вызвать затруднений.

/*
Функция img_resize(): генерация thumbnails
Параметры:
$src - имя исходного файла
$dest - имя генерируемого файла
$width, $height - ширина и высота генерируемого изображения, в пикселях
Необязательные параметры:
$rgb - цвет фона, по умолчанию - белый
$quality - качество генерируемого JPEG, по умолчанию - максимальное (100)
*/

function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100)
{
  if (!file_exists($src)) return false;

  $size = getimagesize($src);

  if ($size === false) return false;

  // Определяем исходный формат по MIME-информации, предоставленной
  // функцией getimagesize, и выбираем соответствующую формату
  // imagecreatefrom-функцию.
  $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  $icfunc = "imagecreatefrom" . $format;
  if (!function_exists($icfunc)) return false;

  $x_ratio = $width / $size[0];
  $y_ratio = $height / $size[1];

  $ratio = min($x_ratio, $y_ratio);
  $use_x_ratio = ($x_ratio == $ratio);

  $new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
  $new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
  $new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
  $new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

  // Читаем в память файл изображения с помощью функции imagecreatefrom...
  $isrc = $icfunc($src);
  // Создаем новое изображение
  $idest = imagecreatetruecolor($width, $height);

  // Заливка цветом фона
  imagefill($idest, 0, 0, $rgb);
  // Копируем существующее изображение в новое с изменением размера:
  imagecopyresampled(
    $idest, // Идентификатор нового изображения
    $isrc, // Идентификатор исходного изображения
     $new_left, $new_top, // Координаты (x,y) верхнего левого угла в новом изображении
    0, 0, // Координаты (x,y) верхнего левого угла копируемого блока
           // существующего изображения
    $new_width, // Новая ширина копируемого блока
    $new_height, // Новая высота копируемого блока
    $size[0], // Ширина исходного копируемого блока
    $size[1] // Высота исходного копируемого блока
  );
  // Сохраняем результат в JPEG-файле: функция imagejpeg, может выводить
  // результат своей работы не только в броузер, но и в файл. Для этого
  // следует указать имя файла в необязательном втором параметре.
  // Функция imagejpeg имеет и третий необязательный параметр - качество
  // изображения.
  imagejpeg($idest, $dest, $quality);

  imagedestroy($isrc);
  imagedestroy($idest);

  return true;
}
?>

Пример использования:

if (img_resize('original.jpg', 'small.jpg', 100, 100))
  echo 'Image resized OK';
else
  echo 'Resize failed!';
?>

Ссылки по теме: