Я разработал простую форму, которая позволяет пользователю загружать файлы на сервер. Первоначально форма содержит одну кнопку «Просмотр». Если пользователь хочет загрузить несколько файлов, ему нужно нажать кнопку «Добавить дополнительные файлы», которая добавит еще одну кнопку «просмотреть» в форме. Когда форма отправляется, процесс загрузки файла обрабатывается в файле «upload.php». Он отлично работает для загрузки нескольких файлов. Теперь мне нужно отправить форму, используя jQuery '.submit ()' и отправить запрос ajax ['.ajax ()'] в файл 'upload.php' для обработки загрузки файла.
Вот моя форма HTML:
<form enctype="multipart/form-data" action="upload.php" method="post"> <input name="file[]" type="file" /> <button class="add_more">Add More Files</button> <input type="button" id="upload" value="Upload File" /> </form>
Вот JavaScript:
$(document).ready(function(){ $('.add_more').click(function(e){ e.preventDefault(); $(this).before("<input name='file[]' type='file' />"); }); });
Вот код для обработки загрузки файла:
for($i=0; $i<count($_FILES['file']['name']); $i++){ $target_path = "uploads/"; $ext = explode('.', basename( $_FILES['file']['name'][$i])); $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext)-1]; if(move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) { echo "The file has been uploaded successfully <br />"; } else{ echo "There was an error uploading the file, please try again! <br />"; }
}
Любые предложения о том, как мне написать свою функцию .submit (), будут действительно полезными.
Наконец, я нашел решение, используя следующий код:
$('body').on('click', '#upload', function(e){ e.preventDefault(); var formData = new FormData($(this).parents('form')[0]); $.ajax({ url: 'upload.php', type: 'POST', xhr: function() { var myXhr = $.ajaxSettings.xhr(); return myXhr; }, success: function (data) { alert("Data Uploaded: "+data); }, data: formData, cache: false, contentType: false, processData: false }); return false; });
HTML
<form enctype="multipart/form-data" action="upload.php" method="post"> <input name="file[]" type="file" /> <button class="add_more">Add More Files</button> <input type="button" value="Upload File" id="upload"/> </form>
Javascript
$(document).ready(function(){ $('.add_more').click(function(e){ e.preventDefault(); $(this).before("<input name='file[]' type='file'/>"); }); });
для загрузки ajax
$('#upload').click(function() { var filedata = document.getElementsByName("file"), formdata = false; if (window.FormData) { formdata = new FormData(); } var i = 0, len = filedata.files.length, img, reader, file; for (; i < len; i++) { file = filedata.files[i]; if (window.FileReader) { reader = new FileReader(); reader.onloadend = function(e) { showUploadedItem(e.target.result, file.fileName); }; reader.readAsDataURL(file); } if (formdata) { formdata.append("file", file); } } if (formdata) { $.ajax({ url: "/path to upload/", type: "POST", data: formdata, processData: false, contentType: false, success: function(res) { }, error: function(res) { } }); } });
PHP
for($i=0; $i<count($_FILES['file']['name']); $i++){ $target_path = "uploads/"; $ext = explode('.', basename( $_FILES['file']['name'][$i])); $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext)-1]; if(move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) { echo "The file has been uploaded successfully <br />"; } else{ echo "There was an error uploading the file, please try again! <br />"; } } /** Edit: $target_path variable need to be reinitialized and should be inside for loop to avoid appending previous file name to new one. */
Используйте сценарий выше сценария для загрузки ajax. Это будет работать
Мое решение
Код jQuery
$('#my_form_id').on('submit', function(e) { e.preventDefault(); var formData = new FormData($(this)[0]); var msg_error = 'An error has occured. Please try again later.'; var msg_timeout = 'The server is not responding'; var message = ''; var form = $('#my_form_id'); $.ajax({ data: formData, async: false, cache: false, processData: false, contentType: false, url: form.attr('action'), type: form.attr('method'), error: function(xhr, status, error) { if (status==="timeout") { alert(msg_timeout); } else { alert(msg_error); } }, success: function(response) { alert(response); }, timeout: 7000 }); });