PHP - 将图像存储在SESSION数据中?

时间:2009-04-15 23:23:51

标签: php session image

您可以在PHP SESSION中存储图像吗?

我在我的网站上使用PHP进行了多步注册过程。在其中一个步骤中,用户可以上传他们的公司徽标(图像)。

最后一步是处理他们的信用卡。

因此,在将任何图像写入Web服务器并将图像位置写入数据库之前,我想确保其信用卡有效并处理。

因此,是否可以将该图像数据临时存储在SESSION变量中?

如果没有,那么在提交数据之前,人们还会如何暂时将图像数据存储在表单上?

7 个答案:

答案 0 :(得分:30)

您可以预期会话的内存使用量会根据图片的大小而增加。为此,您必须将文件内容保存到会话变量中。

如果它在会话数据中,并且您在上传后有多个步骤,则会在每个页面视图中重新加载(进入会话)图像,直到步骤完成。

我个人建议不要使用会话来保存二进制文件。将映像保存到临时位置,直到注册完成。我只会在会话中保存临时文件的路径。当transaciton完成后,将其移动到适当的位置并进行数据库插入。

另外,从本质上讲,会话数据无论如何都存储在磁盘(或数据库)中,因此您可以保存一次图像文件,然后在完成后发出移动命令。

答案 1 :(得分:10)

我将文件保存到磁盘,您甚至可以使用用户的会话ID命名。然后可能会有一些清理脚本作为一个cron作业运行并删除那些从未成功支付过的人的图像。

如果您尝试在会话中存储图像,那么您做错了。

答案 2 :(得分:3)

上传文件时,会在$ _FILES数组中为其分配一个临时名称。我不知道这些文件的确切生命周期,但您可能能够在会话中捕获该名称,并在验证CC之前推迟move_uploaded_file()调用。

或者,您可以先执行CC步骤。

答案 3 :(得分:1)

有时我们需要在将数据保存到数据库之前预览/确认页面。 但是确认页面的图像文件有点不同。你不能这样做 $_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']);

答案 4 :(得分:1)

如果您必须保留数据,我建议将其保留为base64_encoded字符串。您可以直接将base64_encode图像数据发送到浏览器。

如果我处于类似情况,我宁可保存图像并在session / db中保存图像信息。如果由于某种原因注册失败,我将在以后取消链接该文件。偶尔运行cron作业来查找图像缺失的链接。

但我真的建议你坚持第二种选择,避免麻烦。

答案 5 :(得分:0)

是的,您可以在PHP会话中存储图像。将其作为字符串(即二进制数据)导入PHP,然后将其放入会话中。

您将希望它只有它需要的大小,并且您需要在不需要它时立即将其删除,因为会话中的大量信息会减慢会话启动速度。

答案 6 :(得分:0)

您可以轻松地将会话中的图像数据存储为基本编码。在生产服务器中,您应该有足够的RAM。 在放入mongoDB之前,我的应用程序需要多达40MB的4个图像/应用程序进行更新和更改。 (基本编码使图像尺寸增大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);

案例将是:您有多个要上传的图像以及客户端和服务器验证的大小和类型。从会话中获取速度更快。 将DB保存图像后的变量放入DB null。

浏览器将显示使用以下内容显示该图像:

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

在代码到达块结尾后,您可以使用空字符串更新图像的会话。典型的情况是更新表单字段并进行验证,以及用户想要更改文本时。您还希望显示在这些失败的更新之间上载了哪些图像。如果要保存往返(建议),请在会话中保留数据一段时间,并在代码退出后清空该值。