如何在PHP中使用会话实现一个上传进度功能

  介绍

这期内容当中小编将会给大家带来有关如何在PHP中使用会话实现一个上传进度功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

具体如下:

实现文件上传进度条基本是依靠JS插件或HTML5的文件API来完成,其实PHP配合ajax也能实现此功能。

PHP手册对于会议上传进度是这么介绍的:

当<代码> session.upload_progress。>

当一个上传在处理中,同时后一个与INI中设置的<代码> session.upload_progress.name> $ _SESSION> session.upload_progress。前缀代码与<代码> session.upload_progress.name> & lt; php ?   $ key =, ini_get (“session.upload_progress.prefix"),只ini_get (“session.upload-progress.name");   var_dump ($ _SESSION [$ key]);   ?在

通过将<代码> $ _SESSION [$ key] [“cancel_upload"] 设置为真,还可以取消一个正在处理中的文件上传。当在同一个请求中上传多个文件,它仅会取消当前正在处理的文件上传和未处理的文件上传,但是不会移除那些已经完成的上传。当一个上传请求被这么取消时,带有_file美元<代码> 中的错误将会被设置为UPLOAD_ERR_EXTENSION。

<代码> session.upload_progress.freq 和<代码> session.upload_progress。min_freq INI选项控制了上传进度信息应该多久被重新计算一次。通过合理设置这两个选项的值,这个功能的开销几乎可以忽略不计。

注意:为了使这个正常工作,web服务器的请求缓冲区需要禁用,否则PHP可能仅当文件完全上传完成时才能收到文件上传请求。已知会缓冲这种大请求的程序有Nginx。

<强>下面原理介绍:

当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间,上传进度等)存储在会话当中,然后,随着上传的进行,周期性的更新会话中的信息。这样,浏览器端就可以使用Ajax周期性的请求一个服务器端脚本,由该脚本返回会话中的进度信息;浏览器端的Javascript即可根据这些信息显示/更新进度条了。

PHP。ini需配置以下选项

session.upload_progress.enabled =,“1”;   时间=session.upload_progress.cleanup “1”;   时间=session.upload_progress.prefix “upload_progress_"   时间=session.upload_progress.name “PHP_SESSION_UPLOAD_PROGRESS"   时间=session.upload_progress.freq “1%”;=session.upload_progress.min_freq “1“

其中启用控制upload_progress功能的开启与否,默认开启;
清理则设置当文件上传的请求提交完成后,是否清除会话的相关信息,默认开启,如果需要调试_SESSION美元,则应该设为关闭。
前缀和名称两项用来设置进度信息在会话中存储的变量名/键名。
频率和min_freq两项用来设置服务器端对进度信息的更新频率。合理的设置这两项可以减轻服务器的负担。
在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。

具体的,在上传表单中需要有一个隐藏的输入,它的名字属性为php。ini中session.upload_progress.name的值,它的值为一个由你自己定义的标识符。如下:
,代码如下:

& lt; input 类型=癶idden", name=? lt; ? php  echo  ini_get (& # 39; session.upload_progress.name& # 39;);, ?在“,value=https://www.yisu.com/zixun/"测试"/>

接到文件上传的表单后,php会在$ _SESSION变量中新建键,键名是一个将session.upload_progress。前缀的值与上面自定义的标识符连接后得到的字符串,可以这样得到:

代码如下:

name 美元;=,ini_get (& # 39; session.upload_progress.name& # 39;);   $ key =, ini_get (& # 39; session.upload_progress.prefix& # 39;),只$ _POST[名字]美元;   $ _SESSION [$ key];,//,这里就是此次文件上传的进度信息了   $ _SESSION [$ key]这个变量的结构是这样的:      array  (   & # 39;才能upload_progress_test& # 39;,=祝辞,array  (   ,,,& # 39;start_time& # 39;,=祝辞,1491494993,,,//,开始时间   ,,,& # 39;content_length& # 39;,=祝辞,1410397,,//,帖子请求的总数据长度   ,,,& # 39;bytes_processed& # 39;,=祝辞,1410397,,//,已收到的数据长度   ,,,& # 39;完成# 39;,=祝辞,真的,,,,,,,,,//,请求是否完成,真表示完成,假未完成   ,,,& # 39;文件# 39;,=祝辞,array  (   ,,,,,,0=祝辞,array  (   ,,,,,,,& # 39;field_name& # 39;,=祝辞,& # 39;file1 # 39;   ,,,,,,,& # 39;名字# 39;,=祝辞,& # 39;test.jpg& # 39;   ,,,,,,,& # 39;tmp_name& # 39;,=祝辞,& # 39;D: \ \ wamp \ \ tmp \ \ phpE181.tmp& # 39;,   ,,,,,,,& # 39;错误# 39;,=祝辞,0,   ,,,,,,,& # 39;完成# 39;,=祝辞,真的,   ,,,,,,,& # 39;start_time& # 39;,=祝辞,1491494993,   ,,,,,,,& # 39;bytes_processed& # 39;,=祝辞,1410096,   ,,,,,),   ,,,),   ),才能   );

如何在PHP中使用会话实现一个上传进度功能