Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.12.2017, 10:14
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Send file отловить ответ на JS
Сделал отправку файла так
<form enctype="multipart/form-data" action="PostTest.CGI" method="post">
        Send this file: <input name="filename" id="Id_iput_file" type="file">
    </form>							 
        <input type="submit" onClick="Test();" value="Send File">


Как отловить в JS, ответ который отправил сервер ? Ну и сделать так что бы он просто вывелся alert'ом, без перехода на новую страницу PostTest.CGI
Ответить с цитированием
  #2 (permalink)  
Старый 08.12.2017, 10:19
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

pokk,
http://javascript.ru/AJAX
Ответить с цитированием
  #3 (permalink)  
Старый 08.12.2017, 11:54
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Ясно, видать проще не как, я уже тоже в эту сторону покопал,застрял на том моменте как из input в js файл передать, т.е как до данных добраться.
Ответить с цитированием
  #4 (permalink)  
Старый 08.12.2017, 12:09
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,728

На самом деле это не такая тривиальная задача, как может показаться на первый взгляд.

Вот код, который должен осуществлять отправку данных на сервер (не тестировал, могут быть даже синтаксические ошибки):
//У формы должен быть класс "async"
$('form.async').submit(function(e){
	e.preventDefault();
	var $form=$(this),
		$submit=$('['type="submit"]');
	
	if($submit.attr('disabled')!==undefined)
		return;
	
	$submit.attr('disabled',true);
	
	new Promise(function(resolve,reject){
		var $files=$form.find('[type="file"]'),
			files=[],
			list=$files.toArray().reduce(function(arr,item){
				for(var i=0;i<item.files.length;i++)
					arr.push(item.files[i]);
				
				return arr;
			},[]),
			counter=0,
			readEnd=function(){
				if(++counter>=list.length)
					resolve(files);
			};
			
		if(!$files.length)
			return resolve(files);
		
		$.each(list,function(file){
			(function(file){
				var fReader=new FileReader();
				fReader.onerror=function(e){
					readEnd();
					alert('Не удалось прочитать файл');
				};
				fReader.onload=function(e){
					readEnd();
					files.push({
						name:file.name,
						code:this.result
					});
				};
				fReader.readAsDataURL(file);
			})(file)
		});
	}).then(function(files){
		var data=$form.serialize();
		if(files.length)
			data+'&'+files.map(function(item,i){
				return 'file['+i+'][name]='+encodeURIComponent(item.name)
					+'&file['+i+'][code]='+item.code;
			});
			
		$.post($form.attr('action'),data,function(res){
			//Handle answer
		});
	},function(){
		alert('Произошла ошибка');
	});
});

Последний раз редактировалось Nexus, 08.12.2017 в 12:12.
Ответить с цитированием
  #5 (permalink)  
Старый 08.12.2017, 16:05
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Nexus,
а надо ли делать через readAsDataURL?

для отправки на сервер есть FormData, с ней все будет просто, а главное, синхронно (асинхронным будет только аяксовый запрос отправки этой само формдаты). Поддержка браузерами такая же, как у FileReader - ИЕ10+

Если не повезло, и надо поддержать старое, то только через скрытый ифрейм (в jquery и прочих это реализовано давно).

Сообщение от Nexus
if(++counter>=list.length)
для выполнения параллельных действий есть Promise.all
Ответить с цитированием
  #6 (permalink)  
Старый 09.12.2017, 12:01
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,728

Alexandroppolus, спасибо за информацию)
О "FormData" я никогда не слышал, поэтому FileReader.
Сообщение от Alexandroppolus
для выполнения параллельных действий есть Promise.all
Да, затупил, с promise.all было бы удобнее)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операционная Система на JS Icat Общие вопросы Javascript 3 17.04.2018 22:54
Вывыод контента через JS inet_boy Элементы интерфейса 0 18.11.2013 03:00
Не получается вставить код js в HTML garmoni Элементы интерфейса 3 05.09.2013 05:56
Вставка кода js с помощью js Alice Общие вопросы Javascript 1 12.06.2013 19:05
ajax send file to server Black Moon AJAX и COMET 1 04.11.2011 17:12