你能在PHP会话中存储图像吗?我有一个多步骤的注册过程使用PHP在我的网站上。在其中一个步骤,用户可以上传他们的公司标志(图像)。最后一步是处理他们的信用卡。因此,在我写任何图像到网络服务器和图像位置的数据库,我想确保他们的信用卡是有效的和过程。因此,是否可以将图像数据临时存储在SESSION变量中?如果没有,那么在提交数据之前,人们还可以如何在表单上临时存储图像数据呢?
j5fpnvbx1#
是的,你可以在一个PHP会话中存储一个图像。把它作为一个字符串(即二进制数据)放入PHP,然后你就可以把它放到会话中。您可能希望它只具有所需的大小,并且需要在不需要时立即删除它,因为会话中的大量信息会降低会话启动的速度。
igsr9ssn2#
有时我们需要在保存数据到数据库之前预览/确认页面。但是图像文件到确认页面有点不同。你不能做$_SESSION['s_name'] = $_FILES['f_name'],因为会话只是保留文本文件。在另一种方法中,在会话中保留文件内容/二进制值。
$_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']);
ivqmmu1c3#
如果你必须保存数据,我建议你把它保存为base64_encoded字符串,你可以直接把base64_encode图像数据发送到浏览器。如果我在类似的情况下,我宁愿保存图像,并在session/db中保存有关图像的信息。如果由于某种原因注册失败,我会稍后取消文件链接。偶尔运行cron作业来定位与图像丢失的链接。但我真的会建议你坚持第二种选择,完全避免麻烦。
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'); ?>"/>
代码到达块的末尾后,您可以使用空字符串更新图像的会话。典型的情况是使用验证更新表单域,以及用户希望更改文本的时间。您还希望显示在这些失败的更新之间上载了什么图像。如果您希望保存往返过程(建议),请在会话中保留数据一段时间,并在代码即将退出后清空该值。
t0ybt7op5#
在表单中放置文件类型时,需要使用全局变量Filesform.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>
4szc88ey6#
你只能期望你的会话的内存使用会随着图像大小的增加而增加,为此,你必须将文件内容保存到一个会话变量中。如果它在会话数据中,并且在上传后有多个步骤,则图像将在每个页面视图中重新加载(到会话中),直到步骤完成。我个人建议不要使用会话来保存二进制文件。在注册完成之前,将映像保存到磁盘上的一个临时位置。我只会在会话中保存临时文件的路径。当事务完成时,将其移动到一个适当的位置并进行数据库插入。此外,从本质上讲,会话数据无论如何都存储在磁盘(或数据库)上,因此您还可以保存映像文件一次,然后在完成后发出move命令。
ia2d9nvy7#
我会把文件保存到磁盘上,你甚至可以用用户的会话ID来命名它。然后可能会有某种清理脚本,作为一个cron作业运行,并删除那些从未成功支付的人的图像。如果您尝试在会话中存储图像,则会出错。
91zkwejq8#
上传文件时,会在$_FILES数组中为其分配一个临时名称,我不知道这些文件的确切寿命,但您可以在会话中捕获该名称,并将move_uploaded_file()调用推迟到CC验证之后。或者,您可以先执行CC步骤。
8条答案
按热度按时间j5fpnvbx1#
是的,你可以在一个PHP会话中存储一个图像。把它作为一个字符串(即二进制数据)放入PHP,然后你就可以把它放到会话中。
您可能希望它只具有所需的大小,并且需要在不需要时立即删除它,因为会话中的大量信息会降低会话启动的速度。
igsr9ssn2#
有时我们需要在保存数据到数据库之前预览/确认页面。但是图像文件到确认页面有点不同。你不能做
$_SESSION['s_name'] = $_FILES['f_name']
,因为会话只是保留文本文件。在另一种方法中,在会话中保留文件内容/二进制值。ivqmmu1c3#
如果你必须保存数据,我建议你把它保存为base64_encoded字符串,你可以直接把base64_encode图像数据发送到浏览器。
如果我在类似的情况下,我宁愿保存图像,并在session/db中保存有关图像的信息。如果由于某种原因注册失败,我会稍后取消文件链接。偶尔运行cron作业来定位与图像丢失的链接。
但我真的会建议你坚持第二种选择,完全避免麻烦。
xoshrz7s4#
您可以轻松地将会话中的图像数据存储为基本编码的图像数据。在生产服务器中,您应该有足够的RAM。我的应用程序需要多达40 MB的4个图像/应用程序,以便在放入mongoDB之前进行更新和更改。(基本编码使图像大小增加了1.3倍。
病例为:你有多个图像要上传,并且客户端和服务器都要验证图像的大小和类型。2从会话中获取图像会更快。3在DB中放入空值后,变量将保存图像。
浏览器将显示带有以下内容的图像:
代码到达块的末尾后,您可以使用空字符串更新图像的会话。典型的情况是使用验证更新表单域,以及用户希望更改文本的时间。您还希望显示在这些失败的更新之间上载了什么图像。如果您希望保存往返过程(建议),请在会话中保留数据一段时间,并在代码即将退出后清空该值。
t0ybt7op5#
在表单中放置文件类型时,需要使用全局变量Files
form.html
process.php
display_picture.php
4szc88ey6#
你只能期望你的会话的内存使用会随着图像大小的增加而增加,为此,你必须将文件内容保存到一个会话变量中。
如果它在会话数据中,并且在上传后有多个步骤,则图像将在每个页面视图中重新加载(到会话中),直到步骤完成。
我个人建议不要使用会话来保存二进制文件。在注册完成之前,将映像保存到磁盘上的一个临时位置。我只会在会话中保存临时文件的路径。当事务完成时,将其移动到一个适当的位置并进行数据库插入。
此外,从本质上讲,会话数据无论如何都存储在磁盘(或数据库)上,因此您还可以保存映像文件一次,然后在完成后发出move命令。
ia2d9nvy7#
我会把文件保存到磁盘上,你甚至可以用用户的会话ID来命名它。然后可能会有某种清理脚本,作为一个cron作业运行,并删除那些从未成功支付的人的图像。
如果您尝试在会话中存储图像,则会出错。
91zkwejq8#
上传文件时,会在$_FILES数组中为其分配一个临时名称,我不知道这些文件的确切寿命,但您可以在会话中捕获该名称,并将move_uploaded_file()调用推迟到CC验证之后。
或者,您可以先执行CC步骤。