如果你想要纯 JS,这只是一个快速的 JavaScript 解决方案。
var file = document.getElementById('id of your input:file').files[0];
var ajax = new XMLHttpRequest;
var formData = new FormData;
formData.append('imagefile', file);
ajax.upload.addEventListener("progress", myProgressHandler, false);
ajax.addEventListener('load', myOnLoadHandler, false);
ajax.open('POST', 'upload.php', true);
ajax.send(formData);
注意: 一些消息来源说应该在创建对象之后调用 Ajax 的 open 方法(在这种情况下,在使用 ajax 之前),但我个人在使用它时从来没有遇到任何问题大大地。所以这取决于你。
事件:
function myProgressHandler(event) {
//your code to track upload progress
var p = Math.floor(event.loaded/event.total*100);
document.title = p+'%';
}
function myOnLoadHandler(event) {
// your code on finished upload
alert (event.target.responseText);
}
您还可以添加更多事件处理程序,例如“error”或“abort”。当然,你需要写upload.php来处理上传的文件(PHP只是一个例子;在SO上有很多例子如何做到这一点)。
您只需要在输入文件元素(代码的上半部分)的“change”事件上进行 Ajax 调用。
此外,您可以编写一些featuresCheck 函数,如果用户的浏览器不支持某些功能,请提供基本的文件上传。
function featuresCheck() {
var res = window.XMLHttpRequest && window.FormData && window.addEventListener;
if (res) return true; else return false;
}
/* and test it in your code */
if (featuresCheck()) {
// use ajax upload
}
else {
// use simple file uploader
}
如果您想使用文件输入的multiple 属性,则不能使用.files[0](选择的第一个文件),并且您需要循环遍历文件列表并为每个文件单独上传(异步当然)。
注意安全。从临时位置移动它们之前,请仔细检查上传的文件(检查 MIME 类型、扩展名、重命名它们)。