2016-08-15 70 views
1

这里是我的代码,test1.php的作品,test2.php不起作用。如何存储和获取图像变量(SESSION)的图像?

test1.php:

<?php 

session_start(); 

header('Content-type: image/jpeg'); 

$text = rand(1000,9999); 
$font_size = 5; 

$image_width = imagefontwidth($font_size) * strlen($text); 
$image_height = imagefontheight($font_size); 
$image = imagecreate($image_width, $image_height); 

imagecolorallocate($image, 255, 255, 255); 
$text_color = imagecolorallocate($image, 0, 0, 0); 

imagestring($image, $font_size, 0, 0, $text, $text_color); 

$_SESSION['image'] = $image; 

$image_session = $_SESSION['image']; 
imagejpeg($image_session); 

?> 

test2.php:

<?php 
session_start(); 

header('Content-type: image/jpeg'); 
$image_session = $_SESSION['image']; 
imagejpeg($image_session); 

?> 

正如你所看到的,test1.php创建一个随机图像。 我可以使用:

<img src="test1.php"> 

显示来自test1.php图像中的所有页面。 但是,我想在其他php文件中使用if语句。

例如:

,如果用户点击提交按钮和输入任何内容(无答案),图像将仍然是相同的,他们必须回答同样的问题。如果失败,图像将会改变。

我不想使用JavaScript来防止用户输入任何内容并将图像存储在磁盘中。

所以,我认为我需要一个变量来存储可以再次使用的图像。 但我发现我不能使用上面的方法。

我该如何做到这一点?

+0

会存储工作吗? \t imagejpeg($ image_session,“/home/abc/a.jpg”); – owaishanif786

+0

雅,但我不想存储它,因为我需要一个可以写入的文件夹,并且它可以占用太多的磁盘空间。 – Frank

+0

HD比RAM更大,因为所有会话通常都存储在RAM中。 – owaishanif786

回答

1

imagecreate()返回代表给定图像的资源。 PHP的会话不能存储资源型变量(更准确地说 - PHP是无法序列化后他们结束脚本),请参阅http://php.net/manual/en/function.session-register.php

注:这是目前不可能在 会议注册资源变量。 ...

您可以将图像序列化到一个字符串,这个字符串存储到会话(未测试):

test1.php:

... 

ob_start(); 
imagejpeg($image); 
$contents = ob_get_contents(); 
ob_end_clean(); 
$_SESSION['image'] = $contents; 

test2.php:

header('Content-type: image/jpeg'); 
die($_SESSION['image']); 
+0

我不能相信它的作品。谢谢! – Frank

0

不知道有关上下文太多,你不能这样做

session_start(); 

$_SESSION['randomValue'] = mt_rand(1000,9999); 

if(someValueIsEntered){ 
    $_SESSION['randomValue'] = mt_rand(1000,9999); 
} 

echo "<img src='test.php?random=".$_SESSION['randomValue']."'/>"; 

test.php的

$randomValue = filter_input(INPUT_GET, 'random'); 

header('Content-type: image/jpeg'); 

$text = $randomValue; 
$font_size = 5; 

$image_width = imagefontwidth($font_size) * strlen($text); 
$image_height = imagefontheight($font_size); 
$image = imagecreate($image_width, $image_height); 

imagecolorallocate($image, 255, 255, 255); 
$text_color = imagecolorallocate($image, 0, 0, 0); 

imagestring($image, $font_size, 0, 0, $text, $text_color); 

imagejpeg($image); 

多个参数例如:

存储有关的信息图像在数组中。

session_start(); 

if(!isset($_SESSION['imageData']){ 
    $_SESSION['imageData'] = array(
            "random" => mt_rand(1000,9999), 
            "x1" => mt_rand(0,10), 
            "x2" => mt_rand(0,10) 
            ); 
} 

if(someValueIsEntered){ 
    //Randomize array again. 
} 

$imageString = "test.php"; 
foreach ($_SESSION['imageData'] as $key => $value) { 
    $index = current($array); 

    if($index == 0) { 
     $seperator = "?"; 
    } else { 
     $seperator = "&"; 
    } 

    $imageString .= $seperator.$key."=".$value; 
} 

echo "<img src='".$imageString."'/>"; 

然后在test.php中调用它们。

+0

谢谢,我正在使用类似的方法。我使用会话来存储随机数,并将其传送到test1.php。它可以工作,但是在我添加图像线之后,我发现我必须将大量数据传递给它。所以我正在寻找更好的方法。 – Frank

+0

我不完全确定你的意思。这在数据传递量上有何不同? – Imbue

+0

例如:imageline()函数需要$ x1 $ y1 $ x2 $ y2,那么我需要创建4个会话变量来保存随机值。为什么我不能使用一个会话? – Frank

相关问题