php 如何在不使用任何插件的情况下获取文件上传进度?
推荐于2018-04-09 · 知道合伙人软件行家
通过HTTP上传文件是一个麻烦事情,浏览器在上传文件过程中不能返回太多的有用信息给用户,由于这个原因,很多用户在不知道进度的条件下选择关闭页面中断上传,以为对他们来说他们不知道要等多久才能够上传完成的.最近几年ajax技术的流行,很多解决方法也应运而生.基本上的解决方式我们能够在没秒钟向浏览器发送一个状态码.
在php编程领域不同的程序员尝试了不同的解决方法.
第一个解决方法:在apc里面实现
第二个解决方法:通过一个php拓展实现
这二个解决方法都很好,但是很少人去采用他们,为什么呢?
主要有二个原因:
1.对于php而言他们都不是php原生的,在他们使用这个之前需要自己去安装拓展
2.他们使用一个本地的内存去传递传递,apc使用系统共享的内存,upload_progress插件使用文件系统的内存.他们都不是很符合php这种专门的web语言的特性
最完美的解决方案是我们可以通过php的session handling system来解决.
php的session系统是php系统的一部分,它可以使用不同的内存来分配处理,比如当前文件系统和memcache.在集群和负载均衡中共享session是非常有用的.
Arnaud leBaln认真思考后创建一个完整的实现了文件上传进度内存分配的功能并且可能会被纳入下个php版本中.
长话短说:在下个版本(5.4?)我们可能就会看到文件上传进度机制在里面
Arnaud编写了一个非常完美的帮助文档来解释这些功能.我们可以配置PHP的选项来使用这些特性,实现我们要确定我们的默认属性
session.upload_progress.enabled = 1
session.upload_progress.prefix = upload_progress_
session.upload_progress.name = PHP_SESSION_UPLOAD_PROGRESS
当我们使用的时候,我们需要创建一个如下HTML格式的表单
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden"
name="<?php echo ini_get("session.upload_progress.name"); ?>"
value="johannesupload" />
<input type="file" name="file1" />
<input type="file" name="file2" />
<input type="submit" />
</form>
当我们上传一个文件的时候,这个文件足够大,我们的服务器会周期性的读取$_SESSION['upload_progress_johanesupload']的值,这个完整的内容在Arnaud编写的帮组文档都有完整的说明,我在这里也不重复了
不久的将来我们就可以抛弃apc这种解决方案
声明:这篇文章所描述的特性并没有包含在当前稳定的php软件里面.这些特性和使用方法都可能会改变。
ps: 就我而言 我觉得文件上传的进度控制浏览器自己就要返回数据给用户,并且提供一个退出按钮来结束上传。
现在和jQyery插件都可以来完成上传进度的控制但是基本上都是基于flash技术来实现,所以php自己如果能提供一种比较完美的解决方案的话
开发人员就可以省去很多麻烦.
2014-12-03