保存上传的JPG到PHP会话.序列化


Saving uploaded JPG to PHP session. Serialization?

我应该使用php序列化吗?

是否有序列化文件大小的限制?jpg文件最大可达10mb

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

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

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

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

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

只要不超过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);
    }
  }
}

否则,如果所有这些都失败,它将无法存储在会话

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"answers"error"项