【发布时间】:2010-10-19 17:49:07
【问题描述】:
你可以在 PHP SESSION 中存储图像吗?
我在我的网站上使用 PHP 进行了多步骤注册过程。在其中一个步骤中,用户可以上传他们的公司徽标(图片)。
最后一步是处理他们的信用卡。
所以在我将任何图像写入网络服务器并将图像位置写入数据库之前,我想确保他们的信用卡有效并进行处理。
因此,是否可以将该图像数据临时存储在 SESSION 变量中?
如果不是,人们在提交数据之前如何将图像数据临时存储在表单上?
【问题讨论】:
你可以在 PHP SESSION 中存储图像吗?
我在我的网站上使用 PHP 进行了多步骤注册过程。在其中一个步骤中,用户可以上传他们的公司徽标(图片)。
最后一步是处理他们的信用卡。
所以在我将任何图像写入网络服务器并将图像位置写入数据库之前,我想确保他们的信用卡有效并进行处理。
因此,是否可以将该图像数据临时存储在 SESSION 变量中?
如果不是,人们在提交数据之前如何将图像数据临时存储在表单上?
【问题讨论】:
您可以预期会话的内存使用量会根据图像的大小而增加。为此,您必须将文件内容保存到会话变量中。
如果它在会话数据中,并且您在上传后有多个步骤,则图像将在每次页面查看时重新加载(到会话中),直到步骤完成。
我个人建议不要使用会话来保存二进制文件。将磁盘上的图像保存到一个临时位置,直到注册完成。我只会在会话中保存临时文件的路径。事务完成后,将其移动到适当的位置并进行数据库插入。
此外,从本质上讲,会话数据无论如何都存储在磁盘(或数据库)上,因此您最好保存一次图像文件,然后在完成后发出移动命令。
【讨论】:
我会将文件保存到磁盘,您甚至可以使用用户的会话 ID 来命名它。然后可能会有某种清理脚本作为 cron 作业运行并删除从未成功付款的人的图像。
如果您尝试在会话中存储图像,那么您做错了。
【讨论】:
上传文件时,它会在 $_FILES 数组中分配一个临时名称。我不知道这些文件的确切生命周期,但您可能能够在会话中捕获该名称并将 move_uploaded_file() 调用推迟到 CC 验证之后。
或者,您可以先执行抄送步骤。
【讨论】:
是的,您可以在 PHP 会话中存储图像。将其作为字符串(即二进制数据)放入 PHP 中,然后您可以将其放入会话中。
您只希望它尽可能大,并且您需要在不需要它时立即将其删除,因为会话中的大量信息会减慢会话启动速度。
【讨论】:
有时我们需要在将数据保存到数据库之前预览/确认页面。
但是确认页面的图像文件有点不同。你不能这样做
$_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']);
【讨论】:
如果您必须保留数据,我建议将其保留为 base64_encoded 字符串。可以直接将base64_encode图片数据发送到浏览器。
如果我处于类似情况,我宁愿保存图像并将有关图像的信息保存在 session/db 中。如果由于某种原因注册失败,我稍后会取消链接文件。并偶尔运行 cron 作业以查找缺少的图像链接。
但我真的建议你坚持第二种选择,完全避免麻烦。
【讨论】:
您可以轻松地将图像数据以基本编码的形式存储在会话中。在生产服务器中,您应该有足够的 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 null 后。
浏览器将显示该图像:
<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/>
您可以在代码到达块末尾后使用空字符串更新图像的会话。典型情况是使用验证更新表单字段以及用户想要更改文本时。您还想显示在这些失败的更新之间上传了什么图像。如果您想保存往返行程(建议),请在会话中保留一段时间的数据,并在代码即将退出后清空该值。
【讨论】: