Konung1991
Добрый день, коллеги!
Вернулся к php после оооочень большого перерыва, поэтому прошу сильно больно за глупые вопросы не пинать).
Когда-то вопрос с загрузкой файла на сервер решался очень просто. Лепил форму, например
<form enctype=»multipart/form-data» method=»post» action=»UploadFile.php?type=EVENT_DOCS&id_event= <input type=»hidden» name=»MAX_FILE_SIZE» value=»20000000″/>
<lable class=»control-label» for=»txtFile1″>Добавить файл:</lable><input name=»txtFile1″ id=»txtFile1″ type=»file»>
<input type=»submit» value=»Загрузить документы»>
</form>В обработчике UploadFile.php грузил файл, например:
…
$cNewFileName =$_FILES[«txtFile1»][‘name’];
move_uploaded_file($_FILES[«txtFile1»][‘tmp_name’], $cUploadDir.$cNewFileName);…
и не парился, что после нажатия на кнопку «Загрузить документ» приложение улетало на новую страницу.
А теперь все приложения singlepage…)))
Ok, думаю… Сляпал ajax-вызов….
function TestDoc(nRecordId_){
var dataObj = {
«txtFile1» : $(«#txtFile1»).val(),
};
var cFuncName = «UploadFile.php»;
$.ajax({
type: «POST»,
url: «UploadFile.php»,
data: dataObj,
success: function(data){ }
})
}… и обломался(((
Массив $_FILES в UploadFile.php приходит пустой.Подскажите, как сейчас принято организовывать upload файлов на сервер БЕЗ ПЕРЕХОДА на новую страницу.
Заранее спасибо!P.S.
header(«Location: «.$_SERVER[‘HTTP_REFERER’]); не предлагайте… там вопрос с авторизацией всплывает(((
miketomlin
Ничего там не всплывает. Просто это не для AJAX’а и редирект на себя нужно делать более вменяемым способом, нежели при помощи HTTP_REFERER
Konung1991
Видимо косо сформулировал… Попробую еще раз…
Форма для закачки файла находится на странице ANYPAGE.php. Если делаем без ajax’а, то после нажатия на кнопку «Загрузить документ» улетаем на страницу UploadFile.php. А мне надо остаться на ANYPAGE.php. И, извините за серость, «более вменяемый» — это какой (где почитать)?
miketomlin
Это не страница, а обработчик. Даже если делать POST-обработку по адресу страницы, с которой загружаешь, все равно нужно потом делать редирект (методом GET). Вон в AJAX’е вы тоже указали адрес обработки, отличный от ANYPAGE.php
Что касается AJAX-реализации, я в jQuery плохо секу, но даже мне очевидно, что вместо файла вы пытаетесь передавать какую-то хрень.
— Добавлено —
Уверен, что решение гуглится на раз.
mkramer
Для отправки файл на сервер нужно создавать объект FormData: https://developer.mozilla.org/ru/docs/Web/API/FormData
https://www.nicesnippets.com/blog/jquery-ajax-form-submit-with-formdata-exampleSPA на jQuery — такое себе
miketomlin
Уточню. Есть два-три варианта:
1) либо не менять адрес обработки и после обработки делать редирект на тек. адрес (возможно, с добавлением #fragment);
2) либо в адресе обработчика указывать адрес возврата, например /upload/anypage.php?anyquery (чтобы потом вернуться на /anypage.php?anyquery[#fragment]);
3) либо захардкодить адрес возврата в обработчике, если загрузка выполняется всегда только с одной страницы.
— Добавлено —
На ровном месте использовать для этого куки и т.п. и тем более реферер – идиотизм.
— Добавлено —Ну, ТС знает новые направления (хотя какое там SPA – новое направление???), а новые инструменты не очень
Konung1991
Огромное спасибо! То что надо!)))
Но вот у меня, ни «на раз», ни «на пять» не загуглилось.(((Приложенька писалась тогда, когда React’а и Angular’а даже близко не было))))
Еще раз большое спасибо всем откликнувшимся.)))
MouseZver
Код (Javascript):
$(function() { $( ‘body’ ).on( ‘submit’, ‘form’ function ( e ) { e.preventDefault(); var obj = new FormData( $( this ).get(0) ); console.log( obj ); $.ajax( { url: $( this ).attr( ‘action’ ), type: $( this ).attr( ‘method’ ), contentType: false, processData: false, data: obj, dataType: ‘JSON’, success: function ( json ) { console.log( json ); // … } }); }); });
Konung1991
Есть такое дело((… Я даже не знаю как «ТС» расшифровать (хотя понимаю, что речь обо мне) )))… Вторым вашим вариантом я воспользовался, но получилось плохо, потому что при загрузке страницы есть авторизация, которую пришлось обходить — что ооочень такое-себе решение. Первый ваш вариант мне почему-то в голову не пришел, хотя он скорее всего сработал бы. Но решение с
FormData мне показалось прямее. В любом случае, большое спасибо.))
P.S. В 2011ом HTTP_REFERER идиотизмом не считали… Буду знать)))
miketomlin
Оно не прямее или кривее, а другого плана. Если бы вы в первом посте не стали гнать на обычный способ загрузки без JS, я бы про это вообще не стал писать. Первые два варианта – основные для обычной загрузки. Не знаю, что у вас с авторизацией. Всегда пожалуйста
Считали-считали (для редиректа). Вы тогда, наверное, просто у каких-то ламеров консультировались. Успехов.
— Добавлено —
P.S. «Активный пользователь» с несколькими постами с 2015 года – это сильно
Konung1991
Возможно. А для чего тогда HTTP_REFERER вообще нужен?
Сам в шоке
mkramer
Для сбора некритичной статистики