PHP文件上传进度条怎么显示_PHP上传进度实时显示功能实现【技巧】

3次阅读

php大文件上传进度条可通过四种方法实现:一、apc扩展监控,需启用apc.rfc1867并配合隐藏域与ajax轮询;二、php 5.4+内置session上传进度,启用session.upload_progress.enabled并读取$_session;三、nginx upload_progress_module模块,由nginx维护内存进度并提供json接口;四、纯前端formdata+xmlhttprequest.upload.onprogress事件监听,无需服务端特殊配置。

PHP文件上传进度条怎么显示_PHP上传进度实时显示功能实现【技巧】

如果在PHP中执行大文件上传时,用户无法得知当前上传进度,可能导致误操作或长时间等待。以下是实现PHP文件上传进度条的几种方法:

一、使用APC扩展监控上传进度

APC(Alternative PHP Cache)提供apc_fetch函数读取上传过程中的临时进度信息,需在php.ini中启用apc.rfc1867=On并安装APC扩展。

1、在php.ini中添加配置:apc.rfc1867 = On,并重启Web服务器。

2、在HTML表单中为file字段添加隐藏域:

立即学习PHP免费学习笔记(深入)”;

3、在JavaScript中定时发起AJAX请求,向服务端提交progress_key值,服务端调用apc_fetch(“upload_$progress_key”)获取进度数组。

4、解析返回的数组中currenttotal字段,计算百分比并更新页面进度条。

二、使用Session上传进度(PHP 5.4+内置支持)

PHP 5.4起原生支持通过session.upload_progress.enabled开启上传进度跟踪,无需额外扩展,依赖session机制存储临时进度数据。

1、在php.ini中设置:session.upload_progress.enabled = On,并确认session.save_handler配置有效。

2、HTML表单中加入隐藏字段:

3、在上传处理脚本中,通过$_SESSION[“upload_progress_my_progress”]读取实时进度结构体

4、前端使用setInterval每500ms请求一次进度接口,该接口返回$_SESSION[“upload_progress_my_progress”]中的bytes_uploaded和bytes_total字段。

三、使用Nginx upload_progress_module模块

Nginx可通过第三方模块upload_progress_module拦截上传请求并维护内存中的进度状态,适用于高并发场景且不依赖PHP进程生命周期。

1、编译Nginx时添加–add-module=/path/to/nginx-upload-progress-module参数,启用模块。

2、在nginx.conf中配置upload_progress区域,指定zone名称与内存大小:upload_progress uploads 1m;

3、为上传location添加upload_progress_content_type off与upload_progress_json_output on指令。

4、前端通过GET /progress?X-Progress-ID=xxx访问Nginx暴露的JSON接口,直接获取已上传字节数与总字节数。

四、基于FormData + XMLHttpRequest.upload.onprogress的纯前端方案

该方法不依赖服务端进度支持,仅利用浏览器XMLHttpRequest的原生事件监听上传流,适用于小到中型文件且服务端无特殊配置要求的场景。

1、创建FormData对象append文件字段:formData.append(‘file’, fileinput.files[0]);

2、初始化XMLHttpRequest实例,绑定xhr.upload.onprogress事件处理器。

3、在onprogress回调中读取Event.loaded与event.total,计算上传百分比并更新dom元素样式。

4、发送请求时确保后端接收逻辑不阻塞,避免因PHP脚本执行延迟导致前端事件滞后。

text=ZqhQzanResources