gpt4 book ai didi

javascript - 使用 XMLHttpRequest 的 AJAX 文件上传

转载 作者:数据小太阳 更新时间:2023-10-29 05:41:26 28 4
gpt4 key购买 nike

我知道有很多类似的问题,但我仍然没有找到解决我问题的方法。我正在尝试使用 XMLHttpRequest 上传文件,因此我开发了以下代码:

var sendFiles = function(url,onload,onerror,file,headers){
var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttp'),
upload = xhr.upload;
API.addEvent(xhr,'readystatechange',function(){
if(xhr.readyState==4)
if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
this.response = this.response || this.responseText;
onload.call(xhr);
}else onerror.call(xhr);
});
xhr.open('POST',url,true);
for(var n=0;n<headers.length;n++)
xhr.setRequestHeader(headers[n]);
xhr.send(file);
return xhr;
};

PHP 端脚本是:

<?php
header('Content-type: text/html;charset=ISO-8859-1');
$status = 0;
if(@copy($_FILES['file']['tmp_name'],'test\\' . $_FILES['file']['name']))
$status = 1;
else
$err = '0';
echo '{
"status": ' . $status . '
}';
?>;

但是 var $_FILES['file'] 似乎是空的,这意味着文件没有被发送到服务器。然后我决定在下面的代码中使用 FormData 对象

var sendFiles = function(url,onload,onerror,file,headers){
var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttp'),
upload = xhr.upload,
formData = new FormData();
formData.append('file',file);
API.addEvent(xhr,'readystatechange',function(){
if(xhr.readyState==4)
if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
this.response = this.response || this.responseText;
onload.call(xhr);
}else onerror.call(xhr);
});
xhr.open('POST',url,true);
for(var n=0;n<headers.length;n++)
xhr.setRequestHeader(headers[n]);
xhr.send(formData);
return xhr;
};

它确实有效,但只适用于低至 8mb 左右的文件大小。当我尝试发送大小超过 8mb 的文件时,var $_FILES['file'] 再次变为空

注意:'file' var 对应于 document.getElementsById('fileInput').files[0];

最佳答案

为了避免 post_max_size 的限制问题...同时也是双方内存不足的问题:

在客户端

  • 使用 PUT 而不是 POST :

    xhr.open("put", "upload.php", true);

  • 添加自定义 header 以指定原始文件名和文件大小:

    xhr.setRequestHeader("X-File-Name", file.name);
    xhr.setRequestHeader("X-File-Size", file.size);

  • 直接在您的 XHR 发送方法中使用文件对象:

    xhr.send(file);

    请注意,可以通过输入 [type=file] DOM 对象的“files”属性直接获取文件对象

在服务器端

  • 通过 $_SERVER 读取自定义 header :

    $filename = $_SERVER['HTTP_X_FILE_NAME'];
    $filesize = $_SERVER['HTTP_X_FILE_SIZE'];

  • 使用 php://input 读取文件数据:

    $in = fopen('php://input','r');

然后您将能够不受任何限制地发送非常大的文件(1GB 或更多)!!!

此代码适用于 FireFox 4+、Chrome 6+、IE10+

关于javascript - 使用 XMLHttpRequest 的 AJAX 文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com