2010-11-15 103 views
2

我想實現使用Ajax多個文件上傳,或者至少它應該看起來像ajax(沒有頁面重新加載)。以下是我的代碼...多個文件上傳使用ajax

我可以使用簡單的提交來完成它。在上面的代碼中,我可以獲取所有文件的列表,重新讀取一些文件,然後將剩下的文件上傳到服務器。 但我想用ajax和進度條來做。我不能使用文件api,因爲服務器端的python沒有獲得文件對象。 任何幫助表示讚賞。

<!DOCTYPE html> 

上傳

<script type="text/javascript"> 
     var file_array = []; 
     var file_name_cell,relation_cell, option_cell, sr_no_cell; 
     var rowId = 0; 
     var fileCount = 1; 
     var new_file_id = ''; 
     var array_last_index = 0; 


     /* ----------- To add file name in the hidden field start ----------- */ 

     function addFileName(fileId){ 
      var file = document.getElementById(fileId); 
      for(var i=0; i<file.files.length; i++){ 
       file_array.push(file.files.item(i).fileName); 

      } 
      $('#file_names').val(file_array.join('^')); 
      file.style.display = 'none'; 
      createNewFileInput(); 
      addRow(); 

     } 

     /* ----------- To add file name in the hidden field end ----------- */ 

     /* ----------- To create and display new file input start ------------ */ 

     function createNewFileInput(){ 
      fileCount += 1 
      new_file_id = 'files_' + fileCount; 

      var new_file_input = document.createElement('input'); 
      new_file_input.setAttribute('type', 'file'); 
      new_file_input.setAttribute('name', new_file_id); 
      new_file_input.setAttribute('id', new_file_id); 
      new_file_input.setAttribute('multiple', 'multiple'); 
      new_file_input.setAttribute('onchange', 'addFileName(\'' + new_file_id + '\')'); 
      document.getElementById('file_input_area').appendChild(new_file_input); 

     } 

     /* ----------- To create and display new file input end ------------ */ 

     /* ----------- To add row in the table start ----------- */ 

     function addRow(){ 
      var table = document.getElementById('selected_files_table_body'); 
      var last_row, 
       row; 
      for(var i=array_last_index; i<file_array.length; i++){ 
       rowId += 1; 
       try{ 
        last_row = table.rows.length; 
       } 
       catch(e){ 
        row = table.insertRow(0); 
       } 
       row = table.insertRow(last_row); 
       row.id = rowId; 
       sr_no_cell = row.insertCell(0); 
       sr_no_cell.innerHTML = rowId+'.'; 
       file_name_cell = row.insertCell(1); 
       file_name_cell.style.textAlign = 'left'; 
       file_name_cell.innerHTML = file_array[i]; 
       option_cell = row.insertCell(2); 
       option_cell.innerHTML = '<a href="javascript<b></b>:void(0)"><img src="/django_forms_media/icon/remove.png" onclick="removeRow(' + rowId + ',\'' + file_array[i] + '\');" border=0 /></a>&nbsp;'; 


      } 
      array_last_index = file_array.length; 

     } 

     /* ----------- To add row in the table end ----------- */ 


     /* ----------- To remove row from the table start ----------- */ 

     function removeRow(removeRowId, file_to_remove){ 
      var row = document.getElementById(removeRowId); 
      row.parentNode.removeChild(row); 
      removeFileName(file_to_remove); 
     } 

     /* ----------- To remove row from the table end ----------- */ 

     /* ----------- To remove specific file name from hidden field and array start ----------- */ 

     function removeFileName(file_to_remove){ 
      for (var i = 0; i < file_array.length; i++) { 
       if (file_array[i] == file_to_remove) { 
        file_array.splice(i, 1); 
        array_last_index -= 1; 
        break; 
       } 
      } 
      $('#file_names').val(file_array.join('^')); 
     } 

     /* ----------- To remove specific file name from hidden field and array end ----------- */ 

     /* ----------- To clear the file array and removing all rows start ----------- */ 

     function clearAllFiles(){ 
      file_array = []; 
      var table = document.getElementById("selected_files_table_body"); 
      for (var i = table.rows.length - 1; i > 0; i--) { 
       table.deleteRow(i); 
       rowId = 0; 
      } 
     } 

     /* ----------- To clear the file array and removing all rows end ----------- */ 


    </script> 
</head> 
<body> 
    <div > 

     <div > 
      <div > 
       <fieldset> 
        <legend> 
         Upload Package 
        </legend> 
        <form id="frm_upload_package" name="frm_upload_package" action="/djangoforms/uploadcontents/" method="post" enctype="multipart/form-data"> 
         <div class="selectfile"> 
          <label> 
           Select Files: 
          </label> 
          <br/> 
         </div> 
         <span id="file_input_area"> 
          <input id="files_1" type="file" name="files_1" multiple = "multiple" onchange="addFileName('files_1');"/> 
          <input id="file_names" type="hidden" size=100 name="fileNames" /> 
         </span> 
         <fieldset style="width:70%;"> 
          <legend>Selected Files</legend> 
          <table id = "selected_files_table" name = "selected_files_table" style="margin-left:0" class="sortable" cellspacing="0" cellpadding="3" border="0"> 
           <thead> 
            <tr> 
             <th>Sr.No.</th> 
             <th>File Name</th> 
             <th>Option</th> 

            </tr> 
           </thead> 
           <tbody id = "selected_files_table_body" name = "selected_files_table_body"> 
           </tbody> 
          </table> 
         </fieldset> 
         <div class="buttonrow"> 
          <input type="button" value="Upload" id="upload_package" name="upload_package">&nbsp; 
          <input type="reset" name="reset_button" id="reset_button" value="Cancel" onclick ="clearAllFiles();"/> 

         </div> 
        </form> 
       </fieldset> 
      </div> 
     </div> 
    </div> 
</body> 

回答

4

你必須使用隱藏的iframe,有發送數據時,它無法使用XMLHttpRequest上傳文件。 另外,有很多jQuery插件做這項工作,你可以看看他們。