2011-06-02 37 views
1

我需要使用HTML5拖放操作將元素上放置的所有文件傳輸到服務器。 我在下面提供了相應的js代碼。我在服務器端有一個servlet來收集這些文件並將它放在一個文件夾中。如果我在頁面上放置1或2個文件,這工作正常。但是,如果我刪除4-10個文件,所有文件都在服務器中創建,但多個文件設置爲相同的內容,某些文件內容爲0K。使用html5拖放的多個文件上傳失敗,因爲多個文件獲取相同的內容

可以請你們告訴我如何達到正確的行爲。 我的要求與gmail附件類似! 任何使文件順序上傳的解決方案都非常可觀。

/* 
* Upload files to the server using HTML 5 Drag and drop from the folders on your  local computer 
*/ 

function uploader(place, status, target, show) { 

// Upload image files 
upload = function(file) { 
    // Firefox 3.6, Chrome 6, WebKit 
    if(window.FileReader) { 

     // Once the process of reading file 
     this.loadEnd = function() { 
      bin = reader.result;     
      xhr = new XMLHttpRequest(); 
      xhr.open('POST', target+'?up=true', false); 
      var body = bin; 
      xhr.setRequestHeader('content-type', 'multipart/form-data;'); 
      xhr.setRequestHeader("file-name", file.name); 
      xhr.setRequestHeader("mime-type", file.type); 

      // Firefox 3.6 provides a feature sendAsBinary() 
      if(xhr.sendAsBinary != null) { 
       xhr.sendAsBinary(body); 
      // Chrome 7 sends data but you must use the base64_decode on the PHP side 
      } else { 
       xhr.open('POST', target+'?up=true&base64=true', true); 
       xhr.setRequestHeader('UP-FILENAME', file.name); 
       xhr.setRequestHeader('UP-SIZE', file.size); 
       xhr.setRequestHeader('UP-TYPE', file.type); 
       xhr.send(window.btoa(bin)); 
      } 
      if (show) { 
       var newFile = document.createElement('div'); 
       newFile.innerHTML = 'Loaded : '+file.name+' size '+file.size+' B'; 
       document.getElementById(show).appendChild(newFile);    
      } 
      if (status) { 
       document.getElementById(status).innerHTML = 'Loaded : 100%<br/>Next file ...'; 
      } 
     }; 

     // Loading errors 
     this.loadError = function(event) { 
      switch(event.target.error.code) { 
       case event.target.error.NOT_FOUND_ERR: 
        document.getElementById(status).innerHTML = 'File not found!'; 
       break; 
       case event.target.error.NOT_READABLE_ERR: 
        document.getElementById(status).innerHTML = 'File not readable!'; 
       break; 
       case event.target.error.ABORT_ERR: 
       break; 
       default: 
        document.getElementById(status).innerHTML = 'Read error.'; 
      } 
     }; 

     // Reading Progress 
     this.loadProgress = function(event) { 
      if (event.lengthComputable) { 
       var percentage = Math.round((event.loaded * 100)/event.total); 
       document.getElementById(status).innerHTML = 'Loaded : '+percentage+'%'; 
      }    
     }; 

     // Preview images 
     this.previewNow = function(event) {  
      bin = preview.result; 
      var img = document.createElement("img"); 
      img.className = 'addedIMG'; 
      img.file = file; 
      img.src = bin; 
      document.getElementById(show).appendChild(img); 
     }; 

    reader = new FileReader(); 
    // Firefox 3.6, WebKit 
    if(reader.addEventListener) { 
     reader.addEventListener('loadend', this.loadEnd, false); 
     if (status != null) 
     { 
      reader.addEventListener('error', this.loadError, false); 
      reader.addEventListener('progress', this.loadProgress, false); 
     } 

    // Chrome 7 
    } else { 
     reader.onloadend = this.loadEnd; 
     if (status != null) 
     { 
      reader.onerror = this.loadError; 
      reader.onprogress = this.loadProgress; 
     } 
    } 
    var preview = new FileReader(); 
    // Firefox 3.6, WebKit 
    if(preview.addEventListener) { 
     preview.addEventListener('loadend', this.previewNow, false); 
    // Chrome 7 
    } else { 
     preview.onloadend = this.previewNow; 
    } 

    // The function that starts reading the file as a binary string 
    reader.readAsBinaryString(file); 

    // Preview uploaded files 
    if (show) { 
     preview.readAsDataURL(file); 
    } 

    // Safari 5 does not support FileReader 
    } else { 
     xhr = new XMLHttpRequest(); 
     xhr.open('POST', target+'?up=true', true); 
     xhr.setRequestHeader('UP-FILENAME', file.name); 
     xhr.setRequestHeader('UP-SIZE', file.size); 
     xhr.setRequestHeader('UP-TYPE', file.type); 
     xhr.send(file); 

     if (status) { 
      document.getElementById(status).innerHTML = 'Loaded : 100%'; 
     } 
     if (show) { 
      var newFile = document.createElement('div'); 
      newFile.innerHTML = 'Loaded : '+file.name+' size '+file.size+' B'; 
      document.getElementById(show).appendChild(newFile); 
     } 
    }    
}; 

// Function drop file 
this.drop = function(event) { 
    event.preventDefault(); 
    var dt = event.dataTransfer; 
    var files = dt.files; 
    for (var i = 0; i<files.length; i++) { 
     var file = files[i]; 
     upload(file); 
    } 
}; 

// The inclusion of the event listeners (DragOver and drop) 

this.uploadPlace = document.getElementById(place); 
this.uploadPlace.addEventListener("dragover", function(event) { 
    event.stopPropagation(); 
    event.preventDefault(); 
}, true); 
this.uploadPlace.addEventListener("drop", this.drop, false); 

} 

謝謝。

回答

2

我有時會今天上午在從html5uploader分析同一代碼度過。隨着一些運氣,我找到了根本原因。

變化reader = new FileReader();var reader = new FileReader();應該解決的問題。

我敢打賭,這是因爲自動聲明未聲明的變量爲全局變量的JavaScript的行爲。這導致reader變量被多個文件拖放到瀏覽器時被所有uploade(file)調用重用。

乾杯!

相關問題