Php 如何使用带有进度条的AJAX上传文档
我想为我的站点创建一个上传页面,以便异步上传文档,我尝试使用AJAX,但AJAX对用户文件系统的访问有限,当信息发送到服务器时,只有文件名显示,没有目录,我想建议如何在不使用JQuery的情况下轻松完成此操作,我还想知道是否有办法监控文件上传的进度,这样我就可以在我的网站上添加进度条Php 如何使用带有进度条的AJAX上传文档,php,javascript,ajax,Php,Javascript,Ajax,我想为我的站点创建一个上传页面,以便异步上传文档,我尝试使用AJAX,但AJAX对用户文件系统的访问有限,当信息发送到服务器时,只有文件名显示,没有目录,我想建议如何在不使用JQuery的情况下轻松完成此操作,我还想知道是否有办法监控文件上传的进度,这样我就可以在我的网站上添加进度条 function createXMLHttpRequestObject(){ var xmlHttp = 3; if(window.ActiveXObject){ try{ /
function createXMLHttpRequestObject(){
var xmlHttp = 3;
if(window.ActiveXObject){
try{
//test for new version of internet Explorer
xmlHttp = new ActiveXObject("Msxml.XMLHTTP");
}
catch(e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e){
xmlHttp = 2;
}
}
}
else{
try{
xmlHttp = new XMLHttpRequest();
}
catch(e){
xmlHttp = 1;
}
}
if(!xmlHttp){
alert("Error creating Objece");
}
else{
var xHttpArr = new Array();
xHttpArr.push(xmlHttp);
var i = xHttpArr.length - 1;
return xHttpArr[i];
}
}
function process(xmlHttp, i){
if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
//value = encodeURIComponent( objRef.value );
xmlHttp.open("GET", "php/AjaxBody.php?value="+i, true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
}
else{
alert("Hold on");
}
}
function handleServerResponse(){
if(test.readyState == 1 || test.readyState == 2 || test.readyState == 3){
}
if (test.readyState == 4){
if(test.status == 200){
txtResponse = test.responseText;
bodyDiv = document.getElementById("body");
bodyDiv.innerHTML = txtResponse;
}
else{
alert("Error with the xmlHttp status");
}
}
/*
else{
alert("Error with the xmlHttp readystate: " + x.status);
} */
}
上面是创建对象的代码
button.onclick = function() {
send = createXMLHttpRequestObject();
frmUpload = document.getElementById("frmUpload");
file = document.getElementById("fileUpload");
processSending(send, frmUpload);
}
当调用process方法发送文件时,
在我尝试回显文件路径的服务器上,只有名称出现,如下所示
<?php
echo $_GET['value'];
?>
您可以使用文件读取器
将文件读入阵列缓存
或二进制字符串
中,然后使用多个请求发送例如1MB大小的包。然后,接收php脚本必须通过将每个接收到的部分附加到文件中来“重建”该文件。这还可以解决在服务器上回显文件路径的问题,因为在写入之前,您可以(并且必须)决定将其保存在何处 首先,您的文件上传错误。文件上载要求您使用表单执行正确的POST请求,因为它要求enctype
form属性为multipart/form data
。为什么?浏览器通过POST请求发送二进制文件数据,并通过POST请求对数据进行正确编码,以便在服务器上读取。任何其他方式,您都只需在服务器上获取文件名(您可以使用Fiddler之类的工具进行验证)
好的,那么如何使用AJAX进行文件上传呢?AFAIK无法直接读取用户的文件系统(我认为FileReader
只允许通过浏览器读取沙盒文件系统,但我在这里可能错了),因此我有两种方法:
- 使用隐藏iframe方法进行文件上载。用谷歌搜索你会发现很多信息
- 使用基于Flash的上传程序。最后,我们将对此进行详细介绍
- 传统的方法是在服务器上创建CGI脚本来处理上传。优势是什么?CGI脚本可以在上传过程中运行,允许您检索上传的实际字节级进度。但这也要求您在服务器上的某个位置更新进度,您可以轮询(使用单独的AJAX请求)并在浏览器中向用户显示进度
- 另一种最常用的方法是使用基于flash的上传程序(请不要杀我StackOverflow社区)。是的,它仍然被大牌使用(我在Facebook上看你)。您将拥有的优势是,在服务器上不需要任何特殊脚本。基于Flash的客户端完全知道上载的字节数。此外,您还可以访问实际的文件路径字符串(注意may和string的使用),这在普通JS和HTML中是不可能公开的