我已经实现了以下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">
。显然文件没有发送到服务器。
更改后,它工作正常,但请求仍显示为网络选项卡中的已取消。不知道为什么......