PHP使用Session实现上传进度功能详解(3)
注意表单中的session.upload_progress.name
隐藏项,值设置为了test。表单中仅有一个文件上传input,如果需要,你可以添加多个。
这里需要特别注意一下表单的target属性,这里设置指向了一个当前页面中的iframe。这一点很关键,通过设置target属性,让表单提交后的页面显示在iframe中,从而避免当前的页面跳转。因为我们还得在当前页面显示进度条呢。
上传文件upload.php
<?php /** * 上传文件 */ if(is_uploaded_file($_FILES['file1']['tmp_name'])){ //unlink($_FILES['file1']['tmp_name']); $fileName = 'pic_' . date('YmdHis') . mt_rand(10000,99999); $ext = substr($_FILES['file1']['name'], strrpos($_FILES['file1']['name'], '.')); move_uploaded_file($_FILES['file1']['tmp_name'], $fileName . $ext); }
ajax获取上传进度progress.php
<?php /** * AJAX获取上传文件进度 */ session_start(); $i = ini_get('session.upload_progress.name'); //session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" $key = ini_get("session.upload_progress.prefix") . $_GET[$i]; //session.upload_progress.prefix = "upload_progress_" . 'test' if (!empty($_SESSION[$key])) { $current = $_SESSION[$key]["bytes_processed"]; // 已收到的数据长度 $total = $_SESSION[$key]["content_length"]; // POST请求的总数据长度 echo $current < $total ? ceil($current / $total * 100) : 100; }else{ echo 100; }
注意事项:
1.input标签的位置name为session.upload_progress.name
的input标签一定要放在文件input <input type="file" /> 的前面。
2.通过设置 $_SESSION[$key]['cancel_upload'] = true
可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除。
3.应该通过 setTimeout()
来调用 fetch_progress()
,这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval()
则不能保证这一点,有可能导致进度条出现'不进反退'。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php文件操作总结》、《PHP目录操作技巧汇总》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《PHP网络编程技巧总结》
希望本文所述对大家PHP程序设计有所帮助。