【问题标题】:PHP - Store Images in SESSION data?PHP - 在会话数据中存储图像?
【发布时间】:2010-10-19 17:49:07
【问题描述】:

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

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

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

所以在我将任何图像写入网络服务器并将图像位置写入数据库之前,我想确保他们的信用卡有效并进行处理。

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

如果不是,人们在提交数据之前如何将图像数据临时存储在表单上?

【问题讨论】:

    标签: php session image


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 注册失败怎么办?你怎么知道要删除哪个图像,因为那可能是与另一个 php 实例相关的图像?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • PHP 脚本执行完成后,$_FILES 数组中的所有文件都将被删除,即如果您没有将所有上传的文件移动到其他位置,则所有上传的文件都会丢失。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            您可以轻松地将图像数据以基本编码的形式存储在会话中。在生产服务器中,您应该有足够的 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'); ?>"/>
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-06-10
              • 2011-07-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-07
              相关资源
              最近更新 更多