PHP - хранить изображения в данных сессии? - PullRequest
18 голосов
/ 16 апреля 2009

Можете ли вы сохранить изображение в PHP SESSION?

У меня на сайте многоэтапный процесс регистрации с использованием PHP. На одном из шагов пользователи могут загрузить логотип своей компании (изображение).

Последний шаг - обработка кредитной карты.

Поэтому, прежде чем записывать изображения на веб-сервер и размещать изображения в базе данных, я хочу убедиться, что их кредитная карта действительна и обрабатывается.

Можно ли временно сохранить эти данные изображения в переменной SESSION?

Если нет, то как еще люди временно сохраняют данные изображений в формах перед передачей этих данных?

Ответы [ 7 ]

30 голосов
/ 16 апреля 2009

Можно ожидать, что использование памяти вашей сессии увеличится в зависимости от размера изображений. Для этого необходимо сохранить содержимое файла в переменную сеанса.

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

Я бы лично рекомендовал не использовать сессию для хранения двоичного файла. Сохранение изображения на диске во временную папку до завершения регистрации. Я бы только сохранил путь к временному файлу в сессии. Когда сделка завершена, переместите ее в нужное место и вставьте в базу данных.

Кроме того, по сути, данные сеанса в любом случае сохраняются на диске (или в БД), поэтому вы также можете сохранить файл образа, а затем выполнить команду перемещения после завершения.

10 голосов
/ 16 апреля 2009

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

Если вы пытаетесь сохранить изображение в сеансе, вы делаете это неправильно.

3 голосов
/ 16 апреля 2009

Когда файл загружен, ему присваивается временное имя в массиве $ _FILES. Я не знаю точную продолжительность жизни этих файлов, но вы могли бы захватить это имя в сеансе и отложить вызов move_uploaded_file () до тех пор, пока CC не будет проверен.

Или вы могли бы сначала сделать шаг CC.

1 голос
/ 25 марта 2012

Если вам нужно сохранить данные, я бы посоветовал сохранить их в виде строки base64_encoded. Вы можете напрямую отправить данные изображения base64_encode в браузер.

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

Но я действительно предлагаю вам придерживаться второго варианта и вообще избегать хлопот.

1 голос
/ 25 июня 2011

Иногда нам необходимо предварительно просмотреть / подтвердить страницу перед сохранением данных в базе данных. Но файл изображения на странице подтверждения немного отличается. Вы не можете сделать $_SESSION['s_name'] = $_FILES['f_name'] coz SESSION просто сохраните текстовый файл. Альтернативным способом, сохраняя содержимое файла / двоичное значение в сессии.

$_SESSION['obj_image_session'] = file_get_contents($_FILES['image_name']['tmp_name']);

$file= "new_file.jpg";
$fp=($file,"w");

fwrite($fp,$_SESSION['obj_image_session']);
0 голосов
/ 10 июля 2013

Вы можете легко хранить данные изображения в сеансе как базовые. На рабочем сервере у вас должно быть достаточно оперативной памяти. Моему приложению требовалось до 40 МБ из 4 изображений / приложений для обновления и изменения перед установкой в ​​mongoDB. (Базовое кодирование увеличивает размер изображения в 1,3 раза.)

  $tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"];
  $fp      = fopen($tmpNameSS1, 'r');
  $rawDataSS1 = fread($fp, filesize($tmpNameSS1));
  fclose($fp);
  $SS1FileName = $_FILES["screenshot1"]["name"];
  $encodedSS1Data = base64_encode($rawDataSS1);

  registry::update('sCreateSS1Name', $SS1FileName);
  registry::update('sCreateSS1Data', $encodedSS1Data);

Случай будет: у вас есть несколько изображений для загрузки и проверка клиента и сервера для размера и типа. Это быстрее получить из сессии. После помещения в БД нулевой переменной, содержащей изображение.

Браузер покажет показать это изображение с:

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/>

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

0 голосов
/ 16 апреля 2009

Да, вы можете сохранить изображение в сеансе PHP. Получите его в PHP в виде строки (то есть двоичные данные), а затем вы можете поместить его в сеанс.

Вам нужно, чтобы он был настолько большим, насколько это необходимо, и вам нужно удалить его, как только он вам не понадобится, потому что большие фрагменты информации в сеансе замедляют запуск сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...