Сохранение загруженного JPG в сеанс PHP. Сериализация?

#php

#php

Вопрос:

Должен ли я использовать сериализацию php?

Существует ли ограничение на размер файла для сериализации? Файлы JPG могут занимать до 10 МБ.

Комментарии:

1. чтобы вы знали, PHP уже сериализует переменные сеанса. Но послушайте, что сказал Artefacto.

Ответ №1:

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

Вместо этого вы можете сохранить файлы во временном расположении и сохранить только имя файла в сеансе.

Ответ №2:

Вы можете хранить двоичные данные в переменной сеанса, поэтому ее вообще не нужно изменять. Файлы сеанса уже (более или менее) сериализованы.

В качестве альтернативы вы можете base64 кодировать данные изображения для хранения в данных сеанса.

Сказав это, это кажется плохой идеей — вы бы добавили намного больше нагрузки на сервер для кодирования / декодирования данных изображения при загрузке сеанса (даже больше, если бы вам также пришлось декодировать его в base64), и вы бы загрузили весь файл в память. Я бы сбросил изображение во временный файл и вместо этого сохранил путь к файлу в данных сеанса.

Ответ №3:

Пока вы не превысите memory_limit, у вас должно быть все в порядке с его сохранением.

Тем не менее, вот метод, который я использовал для $_FILES входа в сеанс, предполагая:

  • $_SESSION['File'] где мы его храним
  • $uploadFile загружается ли изображение (например, ссылка на $_FILES )
  • Вы уже установили сеанс

 if ($uploadFile['error'] == UPLOAD_ERR_OK)
{
  // try reading directly from temp directory
  if (is_readable($uploadFile['tmp_name']))
  {
    $_SESSION['File'] = file_get_contents($uploadFile['tmp_name']);
  }
  // not readable as-is, make sure we can move it
  else
  {
    $moveTo = 'uploads' . DIRECTORY_SEPARATOR . $uploadFile['name'];
    if (is_writeable(dirname($moveTo)) amp;amp; move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false)
    {
      // read now that its been moved
      $_SESSION['File'] = file_get_contents($moveTo);

      // cleanup
      @unlink($moveTo);
    }
  }
}
  

В противном случае, если все остальное не удается, его невозможно сохранить в сеансе

Ответ №4:

Сеансы PHP ограничены ограничением использования памяти PHP. Так что 10 мб, вероятно, будет в порядке, но…

Я не думаю, что «сеанс» является правильным выбором для хранения больших двоичных данных. Загруженные файлы отправляются во временную папку на сервере, и вы можете некоторое время получать к ним доступ из этого каталога. Итак, если вам нужно будет получить доступ к этому файлу позже, вы можете просто сохранить временный путь к файлу сеанса.

Пример кода:

 session_start();
$_SESSION["uploaded_file"] = $_FILES["file"];
  

Затем, когда вам нужно скопировать этот файл в реальный путь, вы можете сделать что-то вроде:

 move_uploaded_file($_SESSION["uploaded_file"]["tmp_name"], "images/".$_SESSION["uploaded_file"]["name"]);
  

Вы также можете получить доступ к элементам «тип», «размер» и «ошибка» из $ _SESSION[«uploaded_file»], если они вам нужны.

Комментарии:

1. if you need to reach that file later, you can simply store the temporary file path to the session. — тьфу, правда?

2. -1 Это false. Временные файлы удаляются в конце запроса, поэтому вы не можете сохранить их путь в сеансе и переместить его позже.

3. вы правы, моя ошибка. я проделал аналогичную вещь в скрипте задания cron. конечно, сеанс php был непрерывным некоторое время. пожалуйста, измените принятый ответ. извините.