gpt4 book ai didi

javascript - XMLHttpRequest() 不发送 FormData() 导致空 PHP $_FILES 数组并且没有文件上传

转载 作者:行者123 更新时间:2023-11-29 20:43:56 24 4
gpt4 key购买 nike

我正在尝试做的事情:

本质上,我正在尝试将文件上传到服务器上用户通过 HTML 上传的目录 <input type="file">元素。

为此,我正在创建一个新的 XMLHttpRequest<input> 上元素的 change应将上传文件的数据发送到 upload.php 的事件file 然后将处理上传的文件并将其异步上传到服务器。

我的代码:

HTML

<form class="js-upload-form" method="POST" action="upload.php" enctype="multipart/form-data">
<input class="button js-uploaded-file" type="file" name="file" />
</form>

JS

document.querySelector('.js-uploaded-file').addEventListener('change', function() {

let file = this.files[0];
let formData = new FormData();

formData.append('file', file);

let xhr = new XMLHttpRequest();
xhr.open('POST', 'upload.php', true);

xhr.setRequestHeader('Content-type', 'multipart/form-data');

xhr.upload.onprogress = function(e) {

if (e.lengthComputable) {

let percentComplete = (e.loaded / e.total) * 100;
console.log(percentComplete + '% uploaded');

}
};

xhr.onload = function() {

if (this.status == 200) {

console.info(this.response);

}
};

xhr.send(formData);

}, false);

PHP (上传.php)

print_r($_FILES);

$currentDir = getcwd();
$uploadDirectory = "/uploads/";

$errors = []; // Store all foreseen and unforseen errors here

$fileName = preg_replace("/[^A-Z0-9._-]/i", "_", $_FILES['file']['name']);
$fileSize = $_FILES['file']['size'];
$fileTmpName = $_FILES['file']['tmp_name'];
$fileType = $_FILES['file']['type'];

$uploadPath = $currentDir . $uploadDirectory . $fileName;

if ($fileSize > 2000000) {
$errors[] = "This file is more than 2MB. Sorry, it has to be less than or equal to 2MB";
}

if (empty($errors)) {
$didUpload = move_uploaded_file($fileTmpName, $uploadPath);

if ($didUpload) {
echo "The file " . basename($fileName) . " has been uploaded";
} else {
echo "An error occurred somewhere. Try again or contact the admin";
}
} else {
foreach ($errors as $error) {
echo $error . "These are the errors" . "\n";
}
}

我的问题

这段代码根本不起作用。打印 $_FILES array 返回一个空数组,控制台记录 xhr.response记录在 PHP 中设置的错误消息(“某处发生错误。重试或联系管理员”)。对于解决此问题的任何帮助,我将不胜感激,因为我已经浏览了无数有关此问题的其他在线资源,尽管我觉得我的代码完全按照他们所说的去做,但它仍然无法正常工作。

我尝试过的:

我尝试简单地提交表单而不是尝试使用 FormData() 来提交表单对象和 <input>通过添加提交按钮更改事件,尽管页面重定向到 ...url/upload.php 并且没有异步工作,$_FILES array 包含上传文件的正确数据并且文件已上传到服务器,这让我认为我的 Javascript 代码中一定存在问题,或者与 XMLHttpRequest 有关或 FormData对象。

最佳答案

通常,XMLHttpRequest 将从 FormData 对象生成适当的 Content-Type。

但是,您正在用您手动创建的覆盖它:

xhr.setRequestHeader('Content-type', 'multipart/form-data');

但是,缺少必需的 boundary 属性,因此 PHP 无法找到将请求的各个部分拆分的点。

不要覆盖内容类型。删除引用行。

关于javascript - XMLHttpRequest() 不发送 FormData() 导致空 PHP $_FILES 数组并且没有文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54925494/

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