在尝试通过 AJAX 提交包含文件的表单时遇到 400 错误(错误请求),尽管其他不涉及文件上传的 POST 请求能够成功执行。我已经尝试调整了 contentType
、processData
以及 enctype
等设置,但问题依旧。
问题代码示例:
原本的 AJAX 调用代码是这样的,它使用了 myform.serialize()
作为数据,并且设置了默认的 contentType
和 processData
值,这导致文件上传失败:
$.ajax({
url: formUrl,
data: myform.serialize(),
dataType: "html",
contentType: "application/x-www-form-urlencoded",
processData: false,
method: "post",
// 成功和错误处理...
});
解决过程:
在多次尝试后,我发现正确的做法是使用 FormData
对象来包含表单数据和文件,同时调整 AJAX 调用的相关参数,以确保二进制文件能正确发送到服务器端。以下是修正后的 AJAX 代码段:
var formData = new FormData();
$("[class^='fileUpload']").each(function () {
var fileInput = $(this)[0];
var file = fileInput.files[0];
formData.append(this.id, file);
});
formData.append("myFormData", myform.serialize());
$.ajax({
url: "/pageprocessing/saveuserreference",
data: formData,
dataType: "html",
contentType: false, // 必须为 false,让浏览器自动设置正确的 MIME 类型
processData: false, // 防止 jQuery 将数据转换为字符串
method: "post",
success: function (result) {
$(".close-button").click();
},
error: function (err) {
console.log(err);
}
});
控制器端点:
服务器端的接收方法需要能够处理多部分表单数据,特别是 Request.Form.Files
来获取上传的文件。但是,之前提到的 OnPost
方法并未展示如何具体处理这些数据,只是提到了有一个断点未被触发。确保你的后端处理方法如下所示,能够正确地处理文件上传:
[HttpPost]
public IActionResult SaveUserReference(IFormFileCollection files)
{
// 这里处理上传的文件,例如:
foreach (var file in files)
{
// 检查文件并保存到所需位置
}
// 返回相应的操作结果,比如重定向或 JSON 响应
}