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

cngwdvgl  于 2023-01-12  发布在  PHP
关注(0)|答案(8)|浏览(188)

你能在PHP会话中存储图像吗?
我有一个多步骤的注册过程使用PHP在我的网站上。在其中一个步骤,用户可以上传他们的公司标志(图像)。
最后一步是处理他们的信用卡。
因此,在我写任何图像到网络服务器和图像位置的数据库,我想确保他们的信用卡是有效的和过程。
因此,是否可以将图像数据临时存储在SESSION变量中?
如果没有,那么在提交数据之前,人们还可以如何在表单上临时存储图像数据呢?

j5fpnvbx

j5fpnvbx1#

是的,你可以在一个PHP会话中存储一个图像。把它作为一个字符串(即二进制数据)放入PHP,然后你就可以把它放到会话中。
您可能希望它只具有所需的大小,并且需要在不需要时立即删除它,因为会话中的大量信息会降低会话启动的速度。

igsr9ssn

igsr9ssn2#

有时我们需要在保存数据到数据库之前预览/确认页面。但是图像文件到确认页面有点不同。你不能做$_SESSION['s_name'] = $_FILES['f_name'],因为会话只是保留文本文件。在另一种方法中,在会话中保留文件内容/二进制值。

$_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']);
ivqmmu1c

ivqmmu1c3#

如果你必须保存数据,我建议你把它保存为base64_encoded字符串,你可以直接把base64_encode图像数据发送到浏览器。
如果我在类似的情况下,我宁愿保存图像,并在session/db中保存有关图像的信息。如果由于某种原因注册失败,我会稍后取消文件链接。偶尔运行cron作业来定位与图像丢失的链接。
但我真的会建议你坚持第二种选择,完全避免麻烦。

xoshrz7s

xoshrz7s4#

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

病例为:你有多个图像要上传,并且客户端和服务器都要验证图像的大小和类型。2从会话中获取图像会更快。3在DB中放入空值后,变量将保存图像。
浏览器将显示带有以下内容的图像:

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

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

t0ybt7op

t0ybt7op5#

在表单中放置文件类型时,需要使用全局变量Files
form.html

<form action="process.php" method="post" enctype="multipart/form-data">
  <label for="picture">Picture:</label>
  <input type="file" name="picture" id="picture"><br>
  <input type="submit" name="submit" value="Upload">
</form>

process.php

<?php
    session_start();
    //make sure you have created the **upload** directory
    $filename    = $_FILES["picture"]["tmp_name"];
    $destination = "upload/" . $_FILES["picture"]["name"]; 
    move_uploaded_file($filename, $destination); //save uploaded picture in your directory

    $_SESSION['user_name6'] = $destination;

    header('Location: display_picture.php');
?>

display_picture.php

<?php
session_start();
?>
<div>
  <img src="<?php echo $_SESSION['user_name6']; ?>" alt="picture"/>
</div>
4szc88ey

4szc88ey6#

你只能期望你的会话的内存使用会随着图像大小的增加而增加,为此,你必须将文件内容保存到一个会话变量中。
如果它在会话数据中,并且在上传后有多个步骤,则图像将在每个页面视图中重新加载(到会话中),直到步骤完成。
我个人建议不要使用会话来保存二进制文件。在注册完成之前,将映像保存到磁盘上的一个临时位置。我只会在会话中保存临时文件的路径。当事务完成时,将其移动到一个适当的位置并进行数据库插入。
此外,从本质上讲,会话数据无论如何都存储在磁盘(或数据库)上,因此您还可以保存映像文件一次,然后在完成后发出move命令。

ia2d9nvy

ia2d9nvy7#

我会把文件保存到磁盘上,你甚至可以用用户的会话ID来命名它。然后可能会有某种清理脚本,作为一个cron作业运行,并删除那些从未成功支付的人的图像。
如果您尝试在会话中存储图像,则会出错。

91zkwejq

91zkwejq8#

上传文件时,会在$_FILES数组中为其分配一个临时名称,我不知道这些文件的确切寿命,但您可以在会话中捕获该名称,并将move_uploaded_file()调用推迟到CC验证之后。
或者,您可以先执行CC步骤。

相关问题