上传并显示图片后,如何使用PHP从服务器中删除图片?

3

在我的php表单中发送图片,它会保存到我的服务器上,在action.php页面上显示。现在当我尝试:

echo '<div id="image"><img src="'.$target_path.'" width="280" height="280"></div>';

代码本来可以正常工作...但如果我在php代码的末尾添加unlink($target_path);,即使它在显示图像后被删除,图像也无法显示...

所以问题是,如何同时显示图像并将其删除,以避免服务器堆积用户图片?


1
你的图片在浏览器获取它之前被删除了。你的 HTML 页面先被检索,而在浏览器能够获取图片之前,“unlink”命令已被执行。 - Marcel Korpel
3个回答

5
尝试另一种方式:输出图像的base-64编码。
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
echo '<div id="image"><img src="data:image/jpg;base64,'.$base64.'" width="280" height="280"></div>';

使用$file变量而不是move_uploaded_file()等函数,将$_FILES[...]['tmp_name']赋值给$file变量。


@MrMadMan 提醒您:根据您使用的文件类型,您可能需要将“image/jpg”更改为“image/png”等。 - bwoebi
如果我想尽可能支持多种类型(jpg、png、gif、jpeg等),该怎么办? - Laurent
@MrMadMan 进行一些切换:switch (strtolower($extension)) { case "jpg": case "jpeg": $mime = "image/jpg"; break; case "png": $mime = "image/png"; break; case "...": $mime = "..."; } - bwoebi
好的,由于某些原因,我的编辑器不喜欢最后一部分:break; case "...": ...;,$extension是从哪里来的?$base64呢? - Laurent
$extension 是你的文件名的最后一部分吧?... 是为了告诉你可以继续为其他情况编写 switch 语句。 - bwoebi
显示剩余3条评论

3

通过创建一个小脚本来获取图像文件名,并在检索后删除它,您可以实现此目标:

<?php
$file = image_file_from_parameter($_GET['image']); 
headers_for_file($file);
readfile($file);
unlink($file);

在您的HTML输出中,然后链接到该脚本:

<img src="path/to/image.php?image=893sudfD983D" />

如果您设置良好的缓存标头,用户将不会注意到您的服务器仅服务了一次文件。

如果我在页面顶部添加这个,它会加载一个空白页面。 - Laurent
1
最好自己定义函数image_file_from_parameter和headers_for_file... - bwoebi
@MrMadMan,你首先必须检查$_GET['image']是否设置,否则会抛出一些错误。而且函数headers_for_file和image_file_from_parameter不存在。你应该编写代码来实际设置正确的头文件。 - TheBrain

1
当你使用img src回显图像的URL时,你只是向浏览器发送图像的URL,而不是实际的图像数据。如果你想通过这种方法查看图像,则需要将图像保留在服务器上。
你可以使用bwoebi的解决方案传递实际的图像数据而不是链接,但更好的解决方案是将图像保留在服务器上,并定期删除旧文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接