2017-04-05 75 views
0

美好的一天全部,表單數據通過ajax和文本字段一起上傳多個文件

我有一個表單將有多個字段。此外,表單正通過使用ajax的表單數據方法提交給php文件。

以下是提交表單數據的JavaScript代碼。

$(".update").click(function(){ 

     $.ajax({ 
     url: 'post_reply.php', 
     type: 'POST', 
     contentType:false, 
     processData: false, 
     data: function(){ 
      var data = new FormData(); 
      data.append('image',$('#picture').get(0).files[0]); 
      data.append('body' , $('#body').val()); 
      data.append('uid', $('#uid').val()); 
      return data; 
     }(), 
      success: function(result) { 
      alert(result); 
      }, 
     error: function(xhr, result, errorThrown){ 
      alert('Request failed.'); 
     } 
     }); 
     $('#picture').val(''); 
$('#body').val(''); 
}); 

而且,下面是實際的形式:

<textarea name=body id=body class=texarea placeholder='type your message here'></textarea> 
<input type=file name=image id=picture > 
<input name=update value=Send type=submit class=update id=update /> 

這種形式和javascript工作好,因爲它們。但是,我試圖能夠使用這一個單一的type = file字段屬性將多個文件上傳到php文件。就像現在一樣,它一次只能取一個文件。如何調整表單和JavaScript代碼以便能夠處理多個文件上傳?

任何幫助將不勝感激。

謝謝!

回答

0

這裏是您可以訪問的ajax,html和php全局。請讓我知道這對你有沒有用。

// Updated part 
jQuery.each(jQuery('#file')[0].files, function(i, file) { 
    data.append('file-'+i, file); 
}); 

// Full Ajax request 
$(".update").click(function(e) { 
    // Stops the form from reloading 
    e.preventDefault(); 

     $.ajax({ 
     url: 'post_reply.php', 
     type: 'POST', 
     contentType:false, 
     processData: false, 
     data: function(){ 
      var data = new FormData(); 
      jQuery.each(jQuery('#file')[0].files, function(i, file) { 
       data.append('file-'+i, file); 
      }); 
      data.append('body' , $('#body').val()); 
      data.append('uid', $('#uid').val()); 
      return data; 
     }(), 
      success: function(result) { 
      alert(result); 
      }, 
     error: function(xhr, result, errorThrown){ 
      alert('Request failed.'); 
     } 
     }); 
     $('#picture').val(''); 
$('#body').val(''); 
}); 

更新HTML:

<form enctype="multipart/form-data" method="post"> 
    <input id="file" name="file[]" type="file" multiple/> 
    <input class="update" type="submit" /> 
</form> 

現在,在PHP中,你應該能夠訪問您的文件:

// i.e.  
$_FILES['file-0'] 
+0

事實上,它似乎工作,但有一個小問題。當我從電腦中選擇文件,然後按提交按鈕...警報功能工作是,但仍然,瀏覽器似乎重新加載..或顯示加載圖標旋轉。我希望當點擊提交按鈕時,該文件被髮送到php文件並彈出警告框。當我按瀏覽器的刷新按鈕時,它不會問我是否要重新提交信息。目前,瀏覽器問我是否要重新提交.....如何解決? ..當按鈕被點擊時,我不希望瀏覽器加載。 – maraj

+0

我已經更新了我的答案,現在應該可以。你需要爲你的函數添加event param,如下所示:'function(e)'並使用'e.preventDefault();'來防止表單重新加載。查看更新的答案。 – loelsonk

+0

@loelsonk我跟着你的鏈接來保存多個文件瀏覽。我從我的系統中選擇了多個文件,並在下面的函數中提示了一個文本:jQuery.each(jQuery('#file')[0] .files,function(i,file))data.append('file-' + i,file); }); 但它只警告一次。我只能保存上次瀏覽的文件。我怎樣才能保存所有瀏覽的文件。 –

0

這裏的另一種方式。

假設你的HTML是這樣的:

<form id="theform"> 
    <textarea name="body" id="body" class="texarea" placeholder="type your message here"></textarea> 
    <!-- note the use of [] and multiple --> 
    <input type="file" name="image[]" id="picture" multiple> 
    <input name="update" value="Send" type="submit" class="update" id="update"> 
</form> 

你可以簡單地做

$("#theform").submit(function(e){ 
    // prevent the form from submitting 
    e.preventDefault(); 
    $.ajax({ 
     url: 'post_reply.php', 
     type: 'POST', 
     contentType:false, 
     processData: false, 
     // pass the form in the FormData constructor to send all the data inside the form 
     data: new FormData(this), 
     success: function(result) { 
      alert(result); 
     }, 
     error: function(xhr, result, errorThrown){ 
      alert('Request failed.'); 
     } 
    }); 
    $('#picture').val(''); 
    $('#body').val(''); 
}); 

因爲我們使用[],你會訪問文件作爲PHP的數組。

<?php 
print_r($_POST); 
print_r($_FILES['image']); // should be an array i.e. $_FILES['image'][0] is 1st image, $_FILES['image'][1] is the 2nd, etc 
?> 

的更多信息:

+0

我測試了代碼。我有一個php文件,用於檢測一個或多個文件何時被提交。這是問題:當我選擇0個文件時,php文件說它有一個文件。當我選擇1個文件時,它說它收到了一個文件。當我選擇兩個文件,點擊提交按鈕後,頁面刷新並形成數據被清除。什麼是問題? – maraj

+0

這是因爲該按鈕在表單內是一個'type =「submit」按鈕 - 意味着,默認情況下,如果您單擊該按鈕,它將提交表單並重新加載頁面。你想防止這一點。檢查我的編輯,特別是HTML和JS代碼。請注意,我將一個'onsubmit'事件處理程序附加到與該按鈕的'onclick'事件處理程序相反的窗體上。 – Mikey