如何通过php将信息存储在转储中[关闭]

Posted

技术标签:

【中文标题】如何通过php将信息存储在转储中[关闭]【英文标题】:how to store information in dump through php [closed] 【发布时间】:2015-04-16 18:28:16 【问题描述】:

我想实时存储由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); 
?>

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

【问题讨论】:

rtfm:php.net/imagejpeg,特别注意它的第二个(可选)参数... 请不要提供链接,因为我不理解我理解的实际工作示例 那么你在这个行业不会走得太远。要么学习阅读文档,要么找到其他职业。 这个例子是为了清理我想将它们存储在网站上不同位置的内存,例如(www.example.com/dump/.jpg) @learner 这就是 Marc B 想要告诉你的。如果您查看imagejpeg() 函数定义,则可以将文件名作为第二个参数传递。请注意,由于图像将被保存,但不再回显到浏览器,您必须执行readfile($img_filename) 才能输出新创建的图像 【参考方案1】:

因此,不要对学习者过于严格,Marc B 建议的解决方案是更仔细地研究imagejpeg() 函数:

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

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

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

因此,您必须完成三个步骤:

    创建唯一的文件名

    将图像保存到文件

    在浏览器中显示图片

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

/* --- 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 页面中立即显示,有两种方法。

方法一(去掉上面重复部分的cmets)这里我们创建图像,保存文件并使用我们创建的文件名生成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; 
        ?>"  />
    </body>
</html>   

方法二 开始同上,区别在保存图片时开始,我们再次使用输出缓冲的方法,但这次我们将输出作为base64编码的字符串传递给img标签。讨厌,讨厌:)

/* 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 );
        ?>"  />
    </body>
</html>   

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

【讨论】:

我添加了 RightClick 建议的解决方案,以添加传递给脚本的 rawurlencoded 名称参数,以使文件名的随机字符更少 我想在页面上调用该图像,包括 html &lt;html&gt; &lt;body &lt;center&gt;&lt;img src="dump/&lt;?php $jpg_image?&gt;.jpg&lt;/center&gt; &lt;/body&gt; &lt;/html&gt; 我使用此代码从转储中获取图像的当前 url 并在 php 上显示它是否正确 @learner 好了,添加了两个示例,说明如何直接生成包含新生成图像的 html 源代码。【参考方案2】:

改变

imagejpeg($jpg_image);

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

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

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

【讨论】:

如果我想设置我们从 html 输入标签获得的图像名称怎么办 我想给图像名称以从字符串$_GET['name']获取它 是的,你有这行 $text = $_GET['name'] ; 将它分配给 $text....所以它是同一件事。我对它进行了 urlencoded,因为我假设您想再次使用 url,对吗? 您可能在文本中包含有人想要在图像上书写的字符,这也可能会干扰写入文件以及稍后通过 url 访问它...尝试使用命名文件+ , !或其他字符 @RightClick 我打字太慢了,我的解决方案与你的相似(但没有复制),但我确实添加了一个版本,允许使用 ob_start() 进行单磁盘访问的相同结果

以上是关于如何通过php将信息存储在转储中[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在通过php存储在文件夹中时更改图像名称

使用 .php 文件生成 MySQL 转储

如何通过创建会话使用 PHP、MYSQL 和 HTML 创建登录系统 [关闭]

php中的用户注册:如何删除未完成激活的用户[关闭]

如何将缺少的 svn:author 批量添加到存储库或转储中?

如何分析来自 Java 核心转储的信息? [关闭]