0

0

PHP 中动态识别并正确渲染图片与视频文件的完整实现

心靈之曲

心靈之曲

发布时间:2026-02-26 19:19:02

|

563人浏览过

|

来源于php中文网

原创

PHP 中动态识别并正确渲染图片与视频文件的完整实现

本文介绍如何在 PHP 文件列表中自动判断媒体类型,对图片使用 标签、对视频使用 标签进行响应式渲染,并兼容分页逻辑与常见格式(如 JPG、PNG、MP4)。

本文介绍如何在 php 文件列表中自动判断媒体类型,对图片使用 `PHP 中动态识别并正确渲染图片与视频文件的完整实现` 标签、对视频使用 `

在构建媒体展示页面(如用户上传画廊或资源库)时,仅支持图片渲染的代码无法适配视频文件——直接用 PHP 中动态识别并正确渲染图片与视频文件的完整实现 加载 MP4 会显示为破损图标。解决的关键在于:基于文件扩展名动态选择 HTML 媒体标签,同时保持原有按修改时间排序与分页功能不变。

以下是优化后的完整实现方案,已整合排序、分页与智能渲染逻辑:

✅ 步骤一:安全获取并排序文件列表

<?php
$dirname = __DIR__; // 确保 $dirname 已正确定义,例如 '/var/www/html/'
$limit = 10;
$targetpage = 'index.php';

// 安全获取 uploads 目录下所有文件(排除目录)
$images = glob($dirname . '/uploads/*.{jpg,jpeg,png,gif,mp4,webm,avi}', GLOB_BRACE);
if ($images === false) $images = [];

// 按最后修改时间降序排序(最新在前)
usort($images, function($a, $b) {
    return filemtime($b) - filemtime($a); // 简化比较函数,避免负数逻辑错误
});

$total_pages = count($images);
$page = max(1, intval($_GET['page'] ?? 1));
$start = ($page - 1) * $limit;
$paginated_images = array_slice($images, $start, $limit);
?>

⚠️ 注意事项

  • 使用 GLOB_BRACE 显式限定支持的扩展名,提升安全性与性能;
  • filemtime() 可能因权限失败,建议增加 is_file() 和 is_readable() 校验(生产环境推荐);
  • 避免直接拼接 $dirname,应使用 realpath() 或配置常量防止路径遍历。

✅ 步骤二:智能渲染图片与视频

<?php if (!empty($paginated_images)): ?>
    <?php foreach ($paginated_images as $image): ?>
        <?php
        $ext = strtolower(pathinfo($image, PATHINFO_EXTENSION));
        $rel_path = str_replace($dirname, '', $image); // 转为 Web 可访问路径(如 /uploads/xxx.jpg)
        ?>
        <?php if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])): ?>
            <figure class="media-item">
                @@##@@" 
                     alt="Media image" 
                     loading="lazy"
                     width="320" height="240">
            </figure>
        <?php elseif (in_array($ext, ['mp4', 'webm', 'ogg'])): ?>
            <figure class="media-item">
                <video controls preload="metadata" width="320" height="240">
                    <source src="<?= htmlspecialchars($rel_path) ?>" type="video/<?= $ext ?>">
                    Your browser does not support the video tag.
                </video>
            </figure>
        <?php else: ?>
            <!-- 可选:跳过不支持类型或显示占位提示 -->
            <div class="media-item unsupported">Unsupported format: <?= $ext ?></div>
        <?php endif; ?>
    <?php endforeach; ?>
<?php else: ?>
    <p>No media files found.</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/2385" title="造次"><img
                                                                                src="https://img.php.cn/upload/ai_manual/001/246/273/176317700859328.png" alt="造次"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/2385" title="造次">造次</a>
                                                                        <p>Liblib打造的AI原创IP视频创作社区</p>
                                                                </div>
                                                                <a href="/ai/2385" title="造次" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
<?php endif; ?>

? 增强建议

  • 使用
    语义化包裹媒体元素,提升可访问性(a11y);
  • htmlspecialchars() 防止 XSS;
  • loading="lazy" 延迟加载提升首屏性能;
  • 视频添加 preload="metadata" 减少初始带宽消耗;
  • 提供 fallback 文本增强兼容性。

✅ 步骤三:基础分页输出(精简版)

<?php
if ($total_pages > $limit):
    $adjacents = 2;
    $lastpage = ceil($total_pages / $limit);
    $lpm1 = $lastpage - 1;

    echo '<div class="pagination">';
    if ($page > 1) echo "<a href='{$targetpage}?page=1'>&laquo; First</a>";

    for ($counter = max(1, $page - $adjacents); $counter <= min($lastpage, $page + $adjacents); $counter++) {
        if ($counter == $page)
            echo "<span class='current'>{$counter}</span>";
        else
            echo "<a href='{$targetpage}?page={$counter}'>{$counter}</a>";
    }

    if ($page < $lastpage) echo "<a href='{$targetpage}?page={$lastpage}'>Last &raquo;</a>";
    echo '</div>';
endif;
?>

✅ 总结

该方案无需额外依赖,纯原生 PHP 即可实现:
? 自动识别 .jpg/.png/.mp4 等主流格式;
? 复用原有时间排序与分页结构;
? 输出符合现代 Web 标准的语义化、安全、高性能 HTML;
? 易于扩展(如添加音频支持只需追加 ['mp3','wav'] 到判断数组)。

将以上三段代码按顺序嵌入你的 index.php,即可让媒体画廊真正“一码多能”。

PHP 中动态识别并正确渲染图片与视频文件的完整实现

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

Golang Web 开发路线:构建高效后端服务
Golang Web 开发路线:构建高效后端服务

《Golang Web 开发路线:构建高效后端服务》围绕 Go 在后端领域的工程实践,系统讲解 Web 框架选型、路由设计、中间件机制、数据库访问与接口规范,结合高并发与可维护性思维,逐步构建稳定、高性能、易扩展的后端服务体系,帮助开发者形成完整的 Go Web 架构能力。

3

2026.02.26

Golang 并发编程专题:掌握多核时代的核心技能
Golang 并发编程专题:掌握多核时代的核心技能

《Golang 并发编程专题:掌握多核时代的核心技能》系统讲解 Go 在并发领域的设计哲学与实践方法,深入剖析 goroutine、channel、调度模型与并发安全机制,结合真实场景与性能思维,帮助开发者构建高吞吐、低延迟、可扩展的并发程序,全面提升多核时代的工程能力。

5

2026.02.26

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

353

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

77

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

35

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

14

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

5

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号