PHP图片显示异常求助:点击仅显示文件名,echo输出img标签存疑
问题排查与解决方法
我来帮你梳理下问题所在,你现在点击后只显示文件名,主要是两个核心原因:HTML标签输出错误,以及图片的访问路径配置不对。下面一步步给你修正:
1. 先解决HTML标签的输出问题
你代码里写的是:
echo "<img src='$path' height='200' width='200'/>";
这里的<和>是HTML实体字符,浏览器会把它们解析成文本形式的<和>,而不是真正的HTML标签,所以根本不会渲染出图片,只会显示类似<img src=xxx...>的文本(或表现为点击后跳转文件名)。
修正方法:直接输出原生的HTML标签就行,PHP的echo可以直接输出HTML内容:
echo "<img src='正确路径' height='200' width='200' alt='上传的图片'/>";
2. 修正图片的访问路径
你现在把图片存在了本地磁盘路径D:\zak/,但Web服务器(比如Apache、Nginx)没办法直接让浏览器访问本地磁盘的绝对路径,浏览器只能访问Web根目录(比如XAMPP的htdocs、WAMP的www)下的文件。
正确的上传路径设置
把上传目录放到Web根目录里,比如创建一个uploads文件夹,然后用$_SERVER['DOCUMENT_ROOT']来获取Web根目录的绝对路径,确保跨环境兼容:
// 设置Web可访问的上传目录 $target_path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/'; // 先检查目录是否存在,不存在就创建 if (!file_exists($target_path)) { mkdir($target_path, 0755, true); }
这样上传的文件会被放到htdocs/uploads/(或对应Web根目录)下,浏览器就能通过/uploads/文件名的路径访问到。
拼接正确的图片URL
在输出img标签时,要使用Web可访问的相对路径:
$img_url = '/uploads/' . $row['image']; echo "<img src='$img_url' height='200' width='200' alt='上传的图片'/>";
完整修正后的代码
整合所有修正点后的代码(还修复了日期格式的小错误,原来的H:m:sa里m是月份,应该用i表示分钟):
<?php // 创建数据库连接并选择库 $conn = mysqli_connect("localhost", "root", "", "upload_images"); if (isset($_POST["submit"])) { $file_name = $_FILES['fileToUpload']['name']; $file_tmp = $_FILES['fileToUpload']['tmp_name']; $file_size = $_FILES['fileToUpload']['size']; $file_error = $_FILES['fileToUpload']['error']; $datetime = date("Y-m-d H:i:s"); // 修正日期格式 // 设置Web可访问的上传目录 $target_path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/'; // 确保目录存在 if (!file_exists($target_path)) { mkdir($target_path, 0755, true); } if (move_uploaded_file($file_tmp, $target_path . $file_name)) { echo "文件上传成功<br>"; } else { echo "文件上传失败<br>"; } // 注意:这里建议用预处理语句防止SQL注入,下面是修正后的写法 $stmt = mysqli_prepare($conn, "INSERT into image_upload (image, created) VALUES (?, ?)"); mysqli_stmt_bind_param($stmt, "ss", $file_name, $datetime); if (mysqli_stmt_execute($stmt)) { echo "图片信息已成功存入数据库<br>"; } else { echo "存入数据库失败,请重试..<br>"; } mysqli_stmt_close($stmt); $sql1 = "SELECT image FROM image_upload order by Id desc limit 1"; $result = mysqli_query($conn, $sql1); if (!$result) { echo "查询错误: " . mysqli_error($conn) . "<br>"; } else { echo "已获取最新上传的图片<br>"; } while ($row = mysqli_fetch_assoc($result)) { $img_url = '/uploads/' . $row['image']; echo "<img src='$img_url' height='200' width='200' alt='上传的图片'/>"; } } ?>
额外重要提醒:SQL注入风险
你原来的代码直接把用户上传的文件名拼接到SQL语句里,存在严重的SQL注入风险,上面的修正代码已经改用了mysqli的预处理语句,这是更安全的写法,一定要注意。
内容的提问来源于stack exchange,提问作者Hameed Basha
相关产品推荐
相关产品推荐

