LINUX.ORG.RU

Загрузка файла на сервер через AJAX. Как сделать?

 , , ,


0

2

Как сделать форму загрузки файла на сервер, работающую через ajax, без перезагрузки страницы? Есть какие-то библиотеки? Видел что-то на флеш и сразу убежал. Есть нормальное?
Заранее спасибо!

★★★★★

Короче, понял, делать через iframe

Qwentor ★★★★★
() автор топика

Почему обязательно на флеш.
Я как понял из предыдущей темы, вам нужно под jQuery? Вот, посмотрите на Uploadify.
Он поддерживает как Flash так и HTML5 версии.

znenyegvkby
()
Ответ на: комментарий от Qwentor

Ну если не хочется платить ~400 руб за стандартную лицензию, то в инете есть кучи уже хакнутых версий. Например, вот. Хотя 400 рублей за библиотеку, которую будешь писать часа 2 где-то, это вполне себе приемлемая цена, можно отдать.

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

хакнутые не хочу использовать, если честно

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от znenyegvkby

Что-то пробую через jquery.form.js - все равно страница перезагружается..

Код формы:

<form class="form-inline upload" enctype="multipart/form-data" id="form{{ number }}">
				  <div class="form-group">
				    <div class="fileinput fileinput-new" data-provides="fileinput">
					    <span class="btn btn-default btn-file"><span></span><input id="file{{ number }}" type="file" /></span>
					    <span class="fileinput-filename"></span><span class="fileinput-new"></span>
					</div>
				  </div>
				  <input type="submit" class="btn btn-primary" value="Загрузить"/>
			</form>




Скрипты:
var options = {
	url: "files.php",
        type: 'post',
        iframe: true,
        dataType: 'json',
        success:    function(data) { 
            console.log(data);
        }
	};

	$("form.upload").submit(function() { 
        $(this).ajaxSubmit(options); 
        return false; 
    }); 


Пробовал не по классу, а по id для одной конкретной формы - то же самое. Может, из-за того, что сами формы аяксом генерируются и события на них не вешаются из-за этого? Что в этом случае делать?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

jquery.on может.. сейчас попробую

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Если формы генерятся скриптом - читай, как биндить ивенты для создаваемых элементов. Есть в документации к .on()

NeverLoved ★★★★★
()
Ответ на: комментарий от NeverLoved

Переделал так:

var options = {
		url: "files.php",
        type: 'post',
        iframe: true,
        dataType: 'json',
        success:    function(data) { 
            console.log(data);
        }
	};

	$("form.upload").on("submit", function() { 
        $(this).ajaxSubmit(options); 
        return false; 
    }); 

Все равно страница перезагружается..
Что я делаю не так?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от ProtoH

«Форма содержит атрибут «enctype=multipart/form-data», но не содержит атрибут «method=post». Вместо этого для отправки данных будет использоваться метод «GET» без указания типа содержимого.»

Убрал - ошибка исчезла, но страница как перезагружалась, так и перезагружается...

сам плагин подключен - уже тыщу раз проверил

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Попробуйте на beforeSubmit какой-нить console.log кинуть, и посмотрите, срабатывает или нет. Может все-таки что-то не так прикрутили?

znenyegvkby
()
Ответ на: комментарий от ProtoH

Переделал так:

var options = {
		url: "files.php",
        type: 'post',
        iframe: true,
        dataType: 'json',
        beforeSubmit: function(){
        	console.log('beforeSubmit done');
        },
        success: function(data){
  
            console.log("data");
        }
	};

	$('form.upload').on("submit", function() {
		
        $(this).ajaxSubmit(options);

        return false;
    });


Работает, если таблица не генерируется аяксом. Если генерируется - не работает((
jquery.on не помогает, похоже

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от pawnhearts

Даааа! точно..
Сделал так:

$('#tree1').bind(
	    'tree.init',
		    function() {

		    var options = {
				url: "files.php",
		        type: 'post',
		        iframe: true,
		        dataType: 'json',
		        beforeSubmit: function(){
		        	console.log('beforeSubmit done');
		        },
		        success: function(data){
		  
		            console.log("data");
		        }
			};

			$('form.upload').on("submit", function() {

		        $(this).ajaxSubmit(options);

		        return false;
		    });
	        
	    }
	);


Все работает!

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от pawnhearts

Теперь другая проблема: в success вместо console.log(«data»); написал console.log(data); , в files.php написал

<?php
echo "test data";

Но мне в ответе ничего не приходит. Почему?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Пальцем в небо, а ты уверен что dataType: 'json' должен быть, если ты туда такие данные посылаешь?

pawnhearts ★★★★★
()
Ответ на: комментарий от Qwentor

У тебя в опциях

dataType: 'json',

А ты пытаешься бросить просто текст

echo «test data»;

Console.log просто не может распарсить, ты отправь application/json

echo json_encode(array('test' => 'test data'));
console.log(data.test);

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Да, уже понял, туплю)) Посмотрел ответ сервера через инструменты разработчика - сеть, ответ есть) надо пореже писать и почаще думать)

Qwentor ★★★★★
() автор топика

FileReader объект есть.

Метод там есть, который представляет файл в bas64. Отправляешь его POST-переменной и на сервере раскодируешь. Можно даже кусочками отправлять

r_asian ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.