Загрузка файла на сервер без смены страницы (детский вопрос)))

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

miketomlin

Уточню. Есть два-три варианта:
1) либо не менять адрес обработки и после обработки делать редирект на тек. адрес (возможно, с добавлением #fragment);
2) либо в адресе обработчика указывать адрес возврата, например /upload/anypage.php?anyquery (чтобы потом вернуться на /anypage.php?anyquery[#fragment]);
3) либо захардкодить адрес возврата в обработчике, если загрузка выполняется всегда только с одной страницы.
— Добавлено —
На ровном месте использовать для этого куки и т.п. и тем более реферер – идиотизм.
— Добавлено —

Ну, ТС знает новые направления (хотя какое там SPA – новое направление???), а новые инструменты не очень :)

 

Konung1991

Огромное спасибо! То что надо!)))
Но вот у меня, ни «на раз», ни «на пять» не загуглилось.(((

Приложенька писалась тогда, когда React’а и Angular’а даже близко не было))))

Еще раз большое спасибо всем откликнувшимся.)))

 

MouseZver

Код (Javascript):
  1. $(function()
  2. {
  3.     $( ‘body’ ).on( ‘submit’, ‘form’ function ( e )
  4.     {
  5.         e.preventDefault();
  6.        
  7.         var obj = new FormData( $( this ).get(0) );
  8.        
  9.         console.log( obj );
  10.        
  11.         $.ajax(
  12.         {
  13.             url: $( this ).attr( ‘action’ ),
  14.             type: $( this ).attr( ‘method’ ),
  15.             contentType: false,
  16.             processData: false,
  17.             data: obj,
  18.             dataType: ‘JSON’,
  19.             success: function ( json )
  20.             {
  21.                 console.log( json );
  22.                
  23.                 // …
  24.             }
  25.         });
  26.     });
  27. });
 

Konung1991

Есть такое дело((… Я даже не знаю как «ТС» расшифровать (хотя понимаю, что речь обо мне) )))… Вторым вашим вариантом я воспользовался, но получилось плохо, потому что при загрузке страницы есть авторизация, которую пришлось обходить — что ооочень такое-себе решение. Первый ваш вариант мне почему-то в голову не пришел, хотя он скорее всего сработал бы. Но решение с
FormData мне показалось прямее. В любом случае, большое спасибо.))
P.S. В 2011ом HTTP_REFERER идиотизмом не считали… Буду знать)))

 

miketomlin

Оно не прямее или кривее, а другого плана. Если бы вы в первом посте не стали гнать на обычный способ загрузки без JS, я бы про это вообще не стал писать. Первые два варианта – основные для обычной загрузки. Не знаю, что у вас с авторизацией. Всегда пожалуйста :)

Считали-считали (для редиректа). Вы тогда, наверное, просто у каких-то ламеров консультировались. Успехов.
— Добавлено —
P.S. «Активный пользователь» с несколькими постами с 2015 года – это сильно :D

 

Konung1991

Возможно. А для чего тогда HTTP_REFERER вообще нужен?

Сам в шоке;)

 

mkramer

Для сбора некритичной статистики

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *