将上传的JPG保存到PHP会话中。序列化?

时间:2011-10-06 13:58:37

标签: php

我应该使用php序列化吗?

序列化文件大小是否有限制? JPG最高可达10mb。

4 个答案:

答案 0 :(得分:1)

除了PHP可用的内存之外,我认为没有任何限制。但是,在会话中存储大文件会导致不必要的延迟,因为会话对象必须在每个请求结束时的非序列化开始时被反序列化(除非在那些您不加载会话的请求中)。

您可以将文件保存在临时位置,并仅在会话中保存文件名。

答案 1 :(得分:1)

您可以将二进制数据存储在会话变量中,因此根本不需要对其进行修改。会话文件已经(或多或少)序列化。

或者,您可以对图像数据进行base64编码以存储在会话数据中。

话虽如此,这似乎是一个坏主意 - 你会在加载会话时添加更多的服务器负载来编码/解码图像数据(如果你还需要对它进行base64解码,你会更多)将整个文件加载到内存中。我会将图像转储到临时文件,并将文件的路径存储在会话数据中。

答案 2 :(得分:0)

只要你没有超过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)) && move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false)
    {
      // read now that its been moved
      $_SESSION['File'] = file_get_contents($moveTo);

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

否则,如果所有其他方法都失败,则无法将其存储在会话中

答案 3 :(得分:-1)

PHP会话受PHP内存使用限制的限制。所以10mb可能还可以,但是......

我不认为“session”是存储大型二进制数据的正确选择。上传的文件将转到服务器上的临时文件夹,您可以从该目录访问它们一段时间。因此,如果您以后需要访问该文件,则只需将临时文件路径存储到会话中即可。

示例代码:

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

然后,当您需要将该文件复制到真实路径时,您可以执行以下操作:

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

如果需要,您还可以从$ _SESSION [“uploaded_file”]中获取“type”,“size”和“error”项目。