php 如何在不使用任何插件的情况下获取文件上传进度?

php 如何在不使用任何插件的情况下获取文件上传进度?,第1张

通过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自己如果能提供一种比较完美的解决方案的话

 开发人员就可以省去很多麻烦.

因为上述 *** 作包含了上传文件的 *** 作,而普通ajax无法实现文件上传,经过百度有使用FormData对象与插件这两种方法,详见前一篇转载的博文,于是我就尝试了一下FormData对象的方法。

情景:我要利用thinkPHP3.2.3框架实现增加商品时对其输入数据合法性的验证之后到前台提示,一开始是通过内置的跳转函数实现的跳转提示,会跳到一个页面显示再返回,这样给人的视觉体验很不好,于是想修改为ajax方式来实现异步更新数据而不刷新此页面,也不离开此页面,而是通过alertd出警告框来提示用户输入数据的合法性与否。因为商品的表单数据中包含文件,所以一开始使用ajax时使用jquery内置的收集数据的方法:$("form").serialize()但是它不支持文件数据的收集,于是百度后就尝试使用FormData加上ajax来实现表单的异步提交并实现文件的上传。

首先在控制器就要修改执行成功或失败时的跳转函数,如

$this->success('添加成功!',U('listGoods'),true)

$this->error('添加失败!',U('add'),true)

细心的同学应该发现了跟以前写的有不同之处吧,就是多给了一个参数,默认是false,设置为true时表明表单是使用ajax提交的,从而不执行跳转,而是返回json格式的数据如下:

{"info":"\u6dfb\u52a0\u6210\u529f\uff01","status":1,"url":"\/shop\/index.php\/Admin\/Goods\/listGoods.html"}

{"info":"\u6dfb\u52a0\u6210\u529f\uff01","status":0,"url":"\/shop\/index.php\/Admin\/Goods\/listGoods.html"}

这样就可以在前台的ajax执行的success回调函数内部获取数据,status=1表示成功,status=0表示失败。

一开始使用的方法代码如下:

function testAjax(){

var formData = new FormData(document.getElementById("addForm"))

$.ajax({

url:"__SELF__",

type:"post",

data:formData,

dataType: 'json',

processData:false,// 告诉jQuery不要去处理发送的数据

contentType:false,// 告诉jQuery不要去设置Content-Type请求头

success:function(data){

window.clearInterval(timer)

console.log("over...")

//判断是否添加成功

if(data.status == 1){

alert(data.info)

location.href = data.url

}

else{

alert(data)

}

},

error:function(e){

alert("错误")

window.clearInterval(timer)

}

})

get()//此处为上传文件的进度条

}

正常情况下是不跳转的,但是我猜应该是使用了FormData对象的缘故,导致ajax执行回调函数后,一直自行跳到一个空白界面显 示返回的json格式的提示信息。这样的效果显然不是我要的,于是就开始测试,看到底是哪里出错了,最后发现确实没法控制它, 正一筹莫展时突然发现现在使用的是绑定了提交按钮的onclick事件,我猜会不会是这个原因,反正改一下也没关系,于是将其改成 限制通过按钮提交表单的方法来实现果然不自行跳转了,真的激动啊!!这时明白最关键原因应该跟FormData无关了,其实就是提 交方式的原因导致的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11932121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存