php - 单击按钮时使用 AJAX 将表单序列化数据和文件发送到服务器
问题描述
我正在尝试使用 AJAX 将表单发送到服务器,并且在此表单中,我还想上传一些文件。但是,表单中的信息是从服务器发送的,我怀疑这会导致一些问题。
下面是我用来尝试提交表单和文件的方法:
HTML
<form id="new_equipment_submit_form"></form>
jQuery
//Submit form
function general_submit_form(path, query, button, form, additional_code) {
$(document).on("click", button, function() {
var data = $(this).closest('form').serialize();
var url = path + '?' + query;
$.ajax({
type: 'POST',
data: data,
url: url,
enctype: 'multipart/form-data',
contentType: false,
processData: false,
success: function(data) {
console.log(data);
if (data == 0) {
alert("Required parameters are empty!");
} else if (data == 1) {
$(".custom_input").closest('tr').addClass('hidden');
$(form).trigger('reset');
additional_code && additional_code(data);
} else if (data == 2) {
alert("Storage name or serial taken");
} else if (data == 3) {
alert("QR code already in use!")
} else if (data == 4) {
alert("Date already booked!");
} else if (data == 5) {
alert("Date booked for this timeslot!");
} else if (data == 6) {
alert("You cannot make bookings in the past!");
}
}
});
});
}
general_submit_form(equipment_path, 'new_equipment_submit', '#submit_new_equipment', '#new_equipment_submit_form', function(form) {
alert("Equipment Added");
}
//Fetch submission form for new equipment
function general_fetch_database(path, query, result) {
var url = path + '?' + query;
$.ajax({
type: 'GET',
url: url,
success: function(data) {
$(result).html(data);
}
});
}
//Fetch submission form for new equipment
general_fetch_database(equipment_path, 'fetch_equipment_submit_form', '#new_equipment_submit_form');
HTML 表单的实际内容是从服务器 PHP 发送的
//Fetch equipment submission form
if (isset($_GET['fetch_equipment_submit_form'])) {
$output = '';
$output .= '
<div id="eq_sub_cat_9" class="type_2_table eq_sub_cat hidden">
<h3>Files Upload</h3>
<table>
<thead>
</thead>
<tbody>
<tr>
<td>
<input type="file" id="eq_sub_filename" name="eq_sub_filename" required>
</td>
</tr>
<tr>
<td>
<select>
<option value="" selected disabled>Select a File Type</option>
<option value="Financial Document">Financial Document</option>
<option value="Manual">Manual</option>
</select>
</td>
</tr>
<tr>
<td>
<div class="labled">
<input type="text" name="eq_sub_file_description">
<span class="bar"></span>
<label>File Description</label>
</div>
</td>
</tr>
</tbody>
</table>
</div>
';
echo $output;
}
//Submit a storage location to database
if (isset($_GET['new_equipment_submit'])) {
if (isset($_FILES['eq_sub_filename']['file'])) {
$file = $_FILES['eq_sub_filename']['file'];
$file_name = $_FILES['eq_sub_filename']['name'];
$file_tmp_name = $_FILES['eq_sub_filename']['tmp_name'];
$file_size = $_FILES['eq_sub_filename']['size'];
$file_error = $_FILES['eq_sub_filename']['error'];
$file_type = $_FILES['eq_sub_filename']['type'];
$file_extention = explode('.', $file_name);
$file_actual_extention = strtolower(end($file_extention));
$allowed = array('jpg', 'jpeg', 'png', 'pdf');
if (in_array($file_actual_extention, $allowed)) {
if ($file_error === 0) {
if ($file_size < 1000000) {
$file_name_new = uniqid('', true).".".$file_actual_extention;
$file_directory = '../file_uploads/'.$file_name_new;
move_uploaded_file($file_tmp_name, $file_directory);
} else {
echo "File size is too big!";
}
} else {
echo "Upload Error!";
}
} else {
echo "File type not allowed!";
}
echo 1;
exit();
}
$equipment_name = $_POST['equipment_name'];
if (empty($equipment_name) || !isset($_POST['equipment_type'])) {
echo 0;
exit();
} else {
$stmt = $mysqli->prepare('SELECT equipment_name FROM equipment_database WHERE equipment_institute_id=? AND equipment_institute_branch_id=? AND equipment_name=? AND equipment_status=?');
$stmt->bind_param('ssss', $institute_id, $institute_branch_id, $equipment_name, $active_status);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows != 0) {
echo 2;
$stmt->close();
exit();
} else {
$stmt1 = $mysqli->prepare('
INSERT
INTO equipment_database (equipment_name, equipment_type, equipment_institute_id, equipment_institute_branch_id, equipment_status)
VALUES (?,?,?,?,?)');
$stmt1->bind_param("sssss", $equipment_name, $equipment_type, $institute_id, $institute_branch_id, $active_status);
if (empty($_POST['equipment_qr_link_input'])) {
$stmt1->execute();
$stmt1->close();
}
}
}
echo 1;
exit();
}
我知道一些变量丢失了,我省略了它们以简化问题。我认为问题出在 jQuery 的 AJAX 部分。
我尝试创建一个表单数据元素,但无论哪种方式,我都收到代码的文件上传部分错误:Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.
.
我曾尝试查看类似的解决方案,但找不到问题使用服务器上传 HTML 表单的解决方案。
任何帮助,将不胜感激!
解决方案
你不能使用serialize()
你multipart/form-data
需要使用一个FormData
对象。
尝试改变:
var data = $(this).closest('form').serialize();
至:
var form = $(this).closest('form')[0];
var data = new FormData(form);
推荐阅读
- python - 了解递归算法及其工作原理
- python - matplotlib 的组标题
- docker - Docker swarm 失去了管理者?
- amazon-web-services - 尝试在后确认功能中使用模型
- r - 因子查找中 NA 的意外回报
- javascript - /v2/search/SARS_CoV_2/GID1716 处的 NoReverseMatch
- python-3.x - Python - 带参数的 pypsexec 命令
- java - mediaRecorder.prepare(); 尝试创建文件时出现错误Getting file not found异常
- api - 我的 api 项目没有达到我的断点
- javascript - 自动显示隐藏 DIV Javascript 语法