我已经实现了以下 JS 代码来上传文件。在 IE 中它工作正常,但在 chrome 中我在服务器端得到一个空文件。我使用 Fiddler 查看了请求数据,发现该请求不包含 Chrome 中的文件数据(在 IE 中它包含)。它看起来像这样:
----WebkitFormBoundary4kjth5kjt54h
Content-Disposition: form-data; name="C:\fakepath\file.txt"; filename=""
Content-Type: application/octet-stream
----WebkitFormBoundary4kjth5kjt54h--
在 IE 中它看起来像:
----------------7dd435hb8d7gs34
Content-Disposition: form-data; name="C:\fakepath\file.txt"; filename="file.txt"
Content-Type: text/plain
The file data bla bla bla
----------------7dd435hb8d7gs34--
所以客户端肯定有问题,但我不知道是什么问题。
当用户单击按钮时,此代码将被激活。
请不要建议创建常规的 HTML<form>
标记,因为我的情况无法实现。它必须使用javascript来完成。
var form = document.createElement("FORM");
form.method = "post";
form.style.display = "none";
// adding some input elements to the form...
// ...
// adding the file input
form.enctype = "multipart/form-data";
var fileInputs = jQuery("input:file");
fileInputs.each(function() {
if (this.value != "") {
form.appendChild(this);
}
});
form.action = "my.servlet.path";
form.submit();
编辑: 新信息:我在“网络”选项卡的 chrome devtools 中注意到请求状态为“已取消”。这意味着什么?请求确实到达了服务器,那么取消了什么?为什么?
解决了
好的,我发现了错误。我在这里发布的代码是实际情况的简化版本。真正发生的是在 之前的页面上有一些全局数据的更新form.submit()
,并且 KnockOut 获取了该更新并<input type="file">
使用空值更新了 。然后显然文件没有发送到服务器。
更改后,它工作正常,但请求仍然在“网络”选项卡中显示为已取消。不知道为什么...