PHP实现基于session.upload_progress的文件上传进度显示功能
本文通过一个实例展示了PHP中基于session.upload_progress的文件上传过程。分享给大家参考,如下:
介绍
Session.upload_progress是PHP5.4的一个新特性。
当会议。上传进度。启用ini选项打开后,PHP可以在每个文件上传时监控上传进度。该信息对上传请求本身没有帮助,但是当文件上传时,应用程序可以向终端发送POST请求(例如,通过XHR)来检查状态。
当正在处理一个上传,同时在INI中设置了一个与session.upload_progress.name同名的变量为POST时,可以在$_SESSION中获取上传进度。当PHP检测到这个POST请求时,它会在$_SESSION中添加一组数据,索引是session.upload_progress.prefix和SESSION的值。上传进度.名称。
打开会话。上传_进度
修改php.ini文件,打开session.upload_progress的支持。
session . upload _ progress . enabled=Onession . upload _ progress . clean up=Onession . upload _ progress . prefix=' upload _ progress _ ' session . upload _ progress . name=' PHP _ session _ upload _ progress ' session。upload _ progress.freq=' 1% '会话。upload _ progress.min _ freq=' 1 '这应该是PHP语言的最佳解决方案,因为这种方法依赖于PHP内部的会话机制,并且开始上传文件创建相关的会话进行读取,文件上传完成后Html5的文件上传api也可以显示上传进度,但是不能用于10以下的IE版本,所以兼容性不是很好。
接下来,我们用一个例子来实现以下相关效果。
修改php上传文件限制
php.ini的默认上传文件大小限制是2M。但是,由于我们需要显示文件上传进度,我们必须能够上传相对较大的文件。尤其是我们在本地服务器上测试的时候,由于服务器保存的路径在本地磁盘上,文件上传相当于在磁盘上复制,速度非常快。想要直观的看到上传进度,需要上传一个比较大的文件。我测试的时候,上传了一个400 m以上的压缩包。
您可以通过php.ini的以下配置来调整上传文件的大小限制(以500M的上限为例)
upload _ max _ filesize=500M//上传文件的最大值,或者调整到更大的post _ max _ size=500M//post模式下传递的数据最大值也可以调整为max _ execution _ time=1800//页面最大执行时间已设置为max _ input _ time=1800//解析传入数据的最大执行时间已设置为memory_limit=128M的最大值;//每页消耗的最大内存已被设置为最大示例程序
首先放最简单的部分,上传文件传输程序
upload.php
?phpif(isset($ _ FILES[' demo ']){ $ tmp=explode(' . ',$ _ FILES[' demo '][' name ']);$后缀_ name=end($ tmp);$name=time()。'.'。$后缀_ name$path=__DIR__。'\\'.$ namemove _ uploaded _ file($ _ FILES[' demo '][' tmp _ name '],$ path);echo“上传成功”;} else { echo ' error}然后前台获取上传文件百分比的界面文件
progress.php
?PHP session _ start();$ key=ini _ get(' session . upload _ progress . prefix ')。$ _ GET[' key '];if(!空($ _ SESSION[$ key]){ $ current=$ _ SESSION[$ key][' bytes _ processed '];$ total=$ _ SESSION[$ key][' content _ length '];echo $当前$总计?最高限额(当前/$总额* 100): 100;} else { echo 100}最后是前台的上传文件界面
index.html
!DOCTYPE html html lang=' en ' head meta charset=' UTF-8 '标题上传文件示例程序/title/head dydiv id=' file UPLOAD ' form id=' UPLOAD-form ' action=' UPLOAD '。PHP ' method=' post ' enctype=' multipart/form-data ' target=' hidden _ iframe ' p输入类型='隐藏'名称=' PHP _ SESSION _ UPLOAD _ PROGRESS '值='文件1 '/输入类型='文件'名称='演示'输入类型='submit '值='上传/p/form/div frame name=' hidden _ iframe ' src=' http : about : blank ' style=' display : none;/iframediv id='process '上传进度:span id=' percent '/span/div/body script src=' http :3358 apps。bdimg。com/libs/jquery/1。6 .4/jquery。量滴js '/script脚本函数fetch _ progress(){ $ .get('progress.php ',{'key':'file1'},function(data){ document。getelementbyid('百分比').innerText=数据"%";if(data==100){ return;} else { setTimeout(fetch _ progress,100);} });} $("#上传表单").submit(function(){ setTimeout(fetch _ progress,100));});/script/html在前台页面,通过形式的目标属性,将提交之后的页面指向了该页的iframe,避免了页面的跳转。
总结
php.ini默认配置的上传文件大小是2M,我们上传文件通常是需要修改一下配置文件使用的。
从php5.4开始,通过php.ini配置session.upload_progress之后,文件上传时,就会创建键为会话。上传进度。前缀会话。上传进度。名字的会议。其中session.upload_progress.prefix是配置文件中定义的,session.upload_progress.name需要在形式表单提交时,一并提交才可以。
文件开始上传,创建会话,上传过程中,会话文件中保存了以上传字节数和总字节数,可以以及计算得到上传文件百分比,在上传完成之后,该会议会被销毁。
引导程序样式的进度条
index.html加上引导程序的进度条样式,顿时高大上多了,哈哈
!DOCTYPE html html lang=' en ' head meta charset=' UTF-8 '标题上传文件示例程序/title link rel='样式表href=' http://cdn。静态的。鲁诺布。com/libs/bootstrap/3。3 .7/CSS/bootstrap。量滴CSS ' rel='外部' nofollow '脚本src=' http :http://cdn。静态的。鲁诺布。com/libs/jquery/2。1 .1/jquery。量滴js /脚本脚本src=' http 3360http://cdn。静态的.边距-top : 30px;左边距left : 30pxdiv id=' file UPLOAD ' form class=' form-horizontal ' role=' form ' id=' UPLOAD-form ' action=' UPLOAD。PHP ' method=' post ' enctype=' multipart/form-data ' target=' hidden _ iframe ' input type=' hidden ' name=' PHP _ SESSION _ UPLOAD _ PROGRESS ' value=' file 1 '/div class=' form-group ' div class=' col-sm-8 ' style=' margin-top : 7px;输入类型=' file ' name=' demo '/div div class=' col-sm-4 '按钮类型=' submit '=' BTN BTN-初选BTN-sm '上传文件/button/div/div/form/div iframe name=' hidden _ iframe ' src=' http : about : blank ' style=' display : none;/iframe div class=' progress ' style=' display : none;div id=' percent ' class='进度条'角色='进度条' aria-value now=' 60 ' aria-value min=' 0 ' aria-value max=' 100 ' style=' width 33600 ';0%/div/div/正文脚本函数fetch_progress(){ $ .get('progress.php ',{'key':'file1'},function(data){ document。getelementbyid('百分比').innerText=数据"%";document.getElementById('百分比')。setAttribute('style ',' width: '数据' %;');文件。getelementsbyclassname('进度')[0]。setAttribute('style '),display:块;');if(data==100){ return;} else { setTimeout(fetch _ progress,100);} });} $("#上传表单").submit(function(){ setTimeout(fetch _ progress,100));});/script/html显示效果
参考文档:
http://PHP。net/手动/zh/session。上传进度。PHP//www .JB 51。net/article/56305。html文件的后缀
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP错误与异常处理方法总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010
希望本文对PHP编程有所帮助。
版权声明:PHP实现基于session.upload_progress的文件上传进度显示功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。