上传进度支持(Upload progress in sessions)
浏览:2304次 出处信息
文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在PHP5.4以前, 我们可以通过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现.
虽然说, 它们能很好的解决现在的问题, 但是也有很明显的不足:
- 1. 他们都需要额外安装(我们并没有打算把APC加入PHP5.4)
- 2. 它们都使用本地机制来存储这些信息, APC使用共享内存, 而uploadprogress使用文件系统(不考虑NFS), 这在多台前端机的时候会造成麻烦.
从PHP的角度来说, 最好的储存这些信息的地方应该是SESSION, 首先它是PHP原生支持的机制. 其次, 它可以被配置到存放到任何地方(支持多机共享).
正因为此, Arnaud Le Blanc提出了针对Session报告上传进度的RFC, 并且现在实现也已经包含在了PHP5.4的主干中.
这个新特性, 提供了一些新的INI配置, 他们和APC的相关配置很类似:
- session.upload_progress.enabled[=1] : 是否启用上传进度报告(默认开启)
- session.upload_progress.cleanup[=1] : 是否在上传完成后及时删除进度数据(默认开启, 推荐开启).
- session.upload_progress.prefix[=upload_progress_] : 进度数据将存储在_SESSION[session.upload_progress.prefix . _POST[session.upload_progress.name]]
- session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS] : 如果_POST[session.upload_progress.name]没有被设置, 则不会报告进度.
- session.upload_progress.freq[=1%] : 更新进度的频率(已经处理的字节数), 也支持百分比表示’%’.
- session.upload_progress.min_freq[=1.0] : 更新进度的时间间隔(秒级)
对于如下的上传表单:
- <form action="upload.php" method="POST" enctype="multipart/form-data">
- <input type="hidden"
- name="<?php echo ini_get("session.upload_progress.name"); ?>" value="laruence" />
- <input type="file" name="file1" />
- <input type="file" name="file2" />
- <input type="submit" />
- </form>
如果我们上传一个足够大的文件(网速要是足够慢就更好:P), 我们就可以从_SESSION中, 得到类似下面的进度信息:
- $_SESSION["upload_progress_laruence"] = array(
- "start_time" => 1234567890, // 请求时间
- "content_length" => 57343257, // 上传文件总大小
- "bytes_processed" => 453489, // 已经处理的大小
- "done" => false, // 当所有上传处理完成后为TRUE
- "files" => array(
- 0 => array(
- "field_name" => "file1", // 表单中上传框的名字
- // The following 3 elements equals those in $_FILES
- "name" => "foo.avi",
- "tmp_name" => "/tmp/phpxxxxxx",
- "error" => 0,
- "done" => true, // 当这个文件处理完成后会变成TRUE
- "start_time" => 1234567890, // 这个文件开始处理时间
- "bytes_processed" => 57343250, // 这个文件已经处理的大小
- ),
- // An other file, not finished uploading, in the same request
- 1 => array(
- "field_name" => "file2",
- "name" => "bar.avi",
- "tmp_name" => NULL,
- "error" => 0,
- "done" => false,
- "start_time" => 1234567899,
- "bytes_processed" => 54554,
- ),
- )
- );
这个是不是很方便呢?
但是还是要提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
Johannes的blog也介绍过: http://schlueters.de/blog/archives/151-Upload-Progress-in-PHP-trunk.html
更多更新信息, 请关注: Changelog
建议继续学习:
- QQ上传大文件为什么这么快 (阅读:12375)
- 10个强大的Ajax jQuery文件上传程序 (阅读:7779)
- 解决securecrt rz 上传rar,gif文件不正确问题 (阅读:7096)
- PHP上传进度条深度解析 (阅读:4891)
- Codeigniter里的无刷新上传 (阅读:4653)
- PHP上传文件类型彻底判断方案及PHP+nginx上传大小彻底控制方案 (阅读:3893)
- PHP JAVA C上传文件如何准确判断文件类型-mime知识普及 (阅读:3620)
- 渐进增强的无刷新多图片上传控件(iFrame+HTML5) (阅读:3463)
- PHP文件上传源码分析(RFC1867) (阅读:3355)
- php_admin_value open_basedir 引起的上传文件失败解决方法 (阅读:3328)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Array dereferencing
文章信息
- 作者:雪候鸟 来源: 风雪之隅
- 标签: 上传 进度
- 发布时间:2011-10-12 00:00:31
建议继续学习
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [67] IOS安全–浅谈关于IOS加固的几种方法
- [65] 如何拿下简短的域名
- [65] android 开发入门
- [63] find命令的一点注意事项
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则