原文:http://www.oschina.net/code/snippet_12_3073
function addDNDListeners(){
    var container = document.getElementById("container");
    var fileList = document.getElementById("fileList");
    container.addEventListener("dragenter", function(event){
        fileList.innerHTML ='';
        event.stopPropagation();
        event.preventDefault();
        }, false);
    container.addEventListener("dragover", function(event){
        event.stopPropagation();
        event.preventDefault();
        }, false);
    container.addEventListener("drop", handleDrop, false);
}
function handleDrop(event){
    var files = event.dataTransfer.files;
    event.stopPropagation();
    event.preventDefault();
     
    var fileList = document.getElementById("fileList");
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        var li = document.createElement('li');
        var progressbar = document.createElement('div');
        var img = document.createElement('img');
        var name = document.createElement('span');
        progressbar.className = "progressBar";
        img.src = files[i].getAsDataURL();
        img.width = 32;
        img.height = 32;                   
        name.innerHTML = file.name;
        li.appendChild(img);           
        li.appendChild(name);
        li.appendChild(progressbar);
        fileList.appendChild(li);
        uploadFile(file, progressbar)
    }
}
function uploadFile(file, progressbar) {
    var xhr = new XMLHttpRequest();
    var upload = xhr.upload;
     
    var p = document.createElement('p');
    p.textContent = "0%";
    progressbar.appendChild(p);
    upload.progressbar = progressbar;              
    upload.addEventListener("progress", uploadProgress, false);
    upload.addEventListener("load", uploadSucceed, false);
    upload.addEventListener("error", uploadError, false);
    xhr.open("POST", "upload.jsp?fileName="+file.name);
    xhr.overrideMimeType("application/octet-stream");
    xhr.sendAsBinary(file.getAsBinary());
}
function uploadProgress(event){            
    if (event.lengthComputable) {
        var percentage = Math.round((event.loaded * 100) / event.total);
        console.log("percentage:" + percentage);
        if (percentage < 100) {
            event.target.progressbar.firstChild.style.width = (percentage*2) + "px";
            event.target.progressbar.firstChild.textContent = percentage + "%";
        }
    }
}
function uploadSucceed(event) {
    event.target.progressbar.firstChild.style.width = "200px";
    event.target.progressbar.firstChild.textContent = "100%";
}          
function uploadError(error) {
    alert("error: " + error);
}
window.addEventListener("load", addDNDListeners, false);