javascript - 使用 $.ajax 上传文件和字符串:非法调用或空表单数据
问题描述
在网页上,我需要将图像文件和 ID 字符串都上传到服务器。通常,我使用$.ajax
. 正如上传文件时经常发生的那样,$.ajax
抛出一个Uncaught TypeError: Illegal invocation
因为该函数默认尝试将文件对象转换为字符串。processData
设置为false
防止这种情况是常见的建议。
但我不能使用这个选项:
- 如果我设置
processData
为false
,则只会将一个空数组发送到服务器。我可以在开发人员工具中看到 Form Data 对象是空的,并且请求对象中没有到达服务器的数据(我使用的是 PHP/Laravel)。 - 如果我省略该选项,我会收到
Illegal invocation
错误消息。
我的代码有什么特别之处,我还能做什么?
下面是大部分的 JS 代码。通过在表格行的最后一个单元格中放置图像来触发文件上传。我需要上传存储在同一表格行的(隐藏)第一个单元格中的图像和 ID。
<script>
// dragover-listener omitted
// Add listeners for drop event to each cell in last column
let imageCells = Array.from(document.getElementsByClassName('image'));
imageCells.forEach(function(cell) {
cell.addEventListener('drop', fileSelect);
});
// Handle drop event
function fileSelect(event) {
event.preventDefault();
// Get data for AJAX request: ID and new image
let parentRow = event.target.closest('tr');
let id = parentRow.cells[0].textContent;
let data = {
id: id,
image: event.dataTransfer.files[0]
}
// data is available
console.log(data);
let ajaxRequest = $.ajax({
url: '/map/set-image',
type: 'POST',
processData: false,
data: data
});
ajaxRequest.done(function(msg) {
console.log(msg);
});
// fail handler omitted
}
</script>
编辑:一些示例 HTML
<tr>
<td class="hidden">4</td>
<td contenteditable="true">John</td>
<td contenteditable="true">Doe</td>
<td contenteditable="true">john.doe@example.com</td>
<td contenteditable="true">555 12345</td>
<td class="image"><img src="/img/avatars/4.jpg"></td>
</tr>
解决方案
只是为了尝试不同的东西,我使用了一个FormData
对象(而不是一个普通的对象)来收集我的数据。所以我换了
let data = {
id: id,
image: event.dataTransfer.files[0]
}
和
let data = new FormData();
data.append('image', event.dataTransfer.files[0]);
data.append('id', id);
还没用,我还是要把第三行换成data.append('id', String(id));
似乎请求失败了,因为当我关闭将请求数据自动转换为字符串 ( processData: false
) 时,ID 被视为数字。
请注意,单独的字符串转换并不能解决问题,只是在初始版本中使用String(id)
而id
不是不起作用 - 我仍然想知道为什么。
推荐阅读
- python - 为什么我得到“方法 DESCRIBE 失败:401 未经授权”
- django - django 使用 for 循环将表行数据保存到数据库
- r - 从序列列中选择特定序列
- c# - SocketLab NotificationAPI 问题
- sql - 使用 SQL 将行转换为列
- apache-nifi - Nifi 在从 oracle 数据库读取时附加了额外的字符
- java - 从 POST 请求中检索数据时出错
- mongodb - “没有反应堆在运行,必须从 Tokio 1.x 运行时的上下文中调用”当将 mongodb 2 与 actix-web 3 一起使用时
- excel - Excel VBA - Financial Model Color Formatting
- kubernetes - 如何识别 statefulset 中不健康的 pod