如何通过php在转储中存储信息

时间:2015-04-16 18:28:17

标签: php html gd

我想实时存储由php创建的图像。目前,每个图像在创建后都会被销毁,但我想将图像存储在我网站上的一个唯一文件夹中。

我见过许多使用专用转储文件夹的网站,例如http://www.example.com/dump/4592898349.jpg,我想知道是否有人可以向我解释我该怎么做。

这是我的html代码,其中包含启动图像生成的表单:

<html>
    <body>
        <form action="result.php" method="get">
            <input type="text" name="name" id="name">
            <input type="button" name="submit" id="submit">
        </form>
    </body>
</html>

这是我的PHP代码,它使用给定的文本创建图像:

<?php
    header('Content-type: image/jpeg');
    $jpg_image = imagecreatefromjpeg('Desert.jpg');
    $white = imagecolorallocate($jpg_image, 73, 41, 236);
    $font_path = 'OpenSans-Italic.TTF';
    $text = $_GET['name'] ;
    imagettftext($jpg_image, 25, 0, 75, 50, $white, $font_path, $text);
    imagejpeg($jpg_image);
    imagedestroy($jpg_image); 
?>

但是,我仍然不知道哪里是保存图像的最佳位置。

2 个答案:

答案 0 :(得分:1)

所以,不要严格对待学习者,Marc B建议的解决方案是关注imagejpeg()函数:

bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )

所以有第二个可选参数$filename,当给出时,它会告诉GD将图像存储在该文件中。

但是它还说,如果您传递文件名,那么图片不会自动输出到浏览器,如果您没有传递第二个参数,就会发生这种情况。

因此,您需要完成三个步骤:

  1. 创建唯一文件名

  2. 将图像保存到文件

  3. 在浏览器中显示图片

  4. 现在最简单的解决方案是:

    /* --- create unique filename --- */
    
    // get name passed or set default, this will be prepended to
    // the unique filename to make it more readable
    $prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing';
    
    // set to the path where you want your images stored
    $dirname = "/your/base/path/wherever/";
    // use a while loop to make sure or new filename does not exist
    while (true) {
        // now build unique filename
        $filename = uniqid($prepend_filename, true) . '.jpg';
        // if filename is unique (file does not exist) then exit loop 
        if (!file_exists($dirname . $filename)) break;
    }
    
    /* --- save image to file --- */
    
    imagejpeg( $jpg_image, $dirname . $filename );
    
    /* --- output image to browser --- */
    
    readfile($dirname . $filename);
    

    所以这基本上可行。这个解决方案唯一不太好的是,首先你要访问磁盘来写图像,然后你必须重新访问文件才能将它输出到浏览器。您可以使用另一种技术来减少文件访问:

    /* --- output image to browser ---*/
    
    // use output buffering to capture outputted image stream
    ob_start();
    // output the image to output buffer
    imagejpeg($jpg_image);
    // stop capture, flush output to browser and save as string
    $img_data = ob_get_flush(); 
    
    /* --- save image to file --- */
    
    $fp = fopen($dirname . $filename, 'w');
    fwrite($fp, $img_data);
    fclose($fp);
    

    因此,这样做的好处是,您不必两次访问磁盘。

    如果您不想将图像作为原始图像格式返回,但实际上想要在html页面中立即显示,则有两种方法。

    方法1 (删除了上面重复部分的注释)在这里我们创建图像,保存文件并使用我们创建的文件名生成html输出。

    <?php
    
    /* --- create unique filename --- */
    
    $prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing';
    $dirname = "/your/base/path/wherever/";
    while (true) {
        $filename = uniqid($prepend_filename, true) . '.jpg';
        if (!file_exists($dirname . $filename)) break;
    }
    
    /* --- save image to file --- */
    
    imagejpeg( $jpg_image, $dirname . $filename );
    
    // now the difference starts
    
    ?><html>
        <head>
            <title>Your title here</title>
            <!-- the rest of your head here -->
        </head>
        <body>
            <img src="http://yourserver.com/your/base/path/wherever/<?php
                echo $filename; 
            ?>" width="100%" />
        </body>
    </html>   
    

    方法2 开始与上面相同,保存图像时差异开始,我们再次使用输出缓冲方法,但这次我们将输出传递给img标签作为base64编码的字符串。讨厌,讨厌:)

    /* Generating the filename is the same as above (not copied here).
       Output buffering same as prior sample, with one difference:
       Now we use ob_get_clean() instead of ob_get_flush() because
       we do not want to output image.
    */
    ob_start();
    imagejpeg($jpg_image);
    $img_data = ob_get_clean();  // NOTE: ob_get_clean() not ob_get_flush()
    
    /* --- save image to file --- */
    
    $fp = fopen($dirname . $filename, 'w');
    fwrite($fp, $img_data);
    fclose($fp);
    
    ?><html>
        <head>
            <title>Your title here</title>
            <!-- the rest of your head here -->
        </head>
        <body>
            <img src="data:image/jpeg;base64,<?php
                echo  base64_encode( $img_data );
            ?>" width="100%" />
        </body>
    </html>   
    

    所以在这里我们使用缓冲的$img_data将文件写入磁盘并直接在html页面中输出它,而浏览器不必从服务器调用文件(但显然有更大的html源)

答案 1 :(得分:0)

变化

imagejpeg($jpg_image);

imagejpeg($jpg_image,"imagefolderpath/image.jpg");

将图像写入文件,而不是输出图像......所以......

$image_url="dump/".rawurlencode(trim($text)).".jpg";
imagejpeg($jpg_image,$image_url);
readfile($image_url);