javascript - 在 Localhost 上使用 XMLHttpRequest 进行文件上传不会触发 PHP 脚本
问题描述
我正在尝试使用 php 和 XMLHttpRequest 构建一个简单的上传系统。但是我无法使用请求实现目标。它不起作用..
这是我用于获取图像文件的 HTML 表单:
<form action="../session/uploader.php" method="post" enctype="multipart/form-data" id="uploadForm">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
这是我的 PHP 脚本,它将图像保存到我的文件系统中:
<?php
if(isset($_POST["submit"])) {
$target_dir = "../db/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
}
?>
现在这工作得很好,但我想使用 XMLHttpRequest 以便在上传图像时页面不需要刷新。我试图做一些看起来非常直接但没有奏效的事情..
首先,我将 PHP 更改为:
<?php
$target_dir = "../db/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
?>
在 HTML 表单的正下方,我添加了一些 Javascript 来生成 XMLHttpRequest 并发送它:
<script>
const uploadForm = document.getElementById("uploadForm");
uploadForm.addEventListener("submit", function(e) {
e.preventDefault();
const xhr = new XMLHttpRequest();
xhr.open("POST", "../session/uploader.php", true);
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send(new FormData(uploadForm));
});
</script>
这里的问题是它根本不起作用。没发生什么事。我没有得到任何反馈。就像没有调用 uploader.php 脚本一样。
有谁知道问题可能是什么?
解决方案
if(isset($_POST["submit"]))
提交按钮将不会包含在此处的表单提交数据集中,就像您刚刚“正常”发送表单一样。
xhr.send(new FormData(uploadForm));
浏览器此时不知道您单击提交按钮实际上触发了整个过程 - 所以它只会包含fileToUpload
文件上传字段的数据,而不包括提交按钮。
您可以添加一个隐藏字段,然后检查是否在 $_POST 中设置,或者检查是否fileToUpload
直接设置(但请记住,该字段将在 $_FILES 中,而不是 $_POST 中。)
xhr.setRequestHeader("Content-Type", "multipart/form-data");
适当的多部分请求还需要在此标头中包含将用于分隔请求正文内的部分的边界。
使用 FormData,这应该会自动添加,因此删除此行 - 它正在用此时此处不完整的标题覆盖正确的标题。
推荐阅读
- qt - 使用 QTextStream 编写问题
- java - 设置 derby_home 和路径后尝试运行 sysinfo 时出错
- javascript - 如何使用 Loadash 获取 JSON 对象中嵌套字段的索引?
- networking - 无法打开 Google 或 Google Capthcas
- javascript - 防止在 this.setState 中使用 this.state (react/no-access-state-in-setstate)
- javascript - api返回一个字符串而不是JSON,我怎样才能让我的应用程序使用一个字符串呢?
- oracle - dbms_utility.exec_ddl_statement 不起作用
- ruby-on-rails - 如何使用 ActiveRecord 查询根据关联标签查找记录
- ssh - 从 Windows 10 到 Windows 10 端口 22 的 SSH 超时和密码问题
- c - 调用返回 char* 的 C 函数时在 python3 中获取负值