Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Send file отловить ответ на JS (https://javascript.ru/forum/misc/71721-send-file-otlovit-otvet-na-js.html)

pokk 08.12.2017 10:14

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

Dilettante_Pro 08.12.2017 10:19

pokk,
http://javascript.ru/AJAX

pokk 08.12.2017 11:54

Ясно, видать проще не как, я уже тоже в эту сторону покопал,застрял на том моменте как из input в js файл передать, т.е как до данных добраться.

Nexus 08.12.2017 12:09

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

Вот код, который должен осуществлять отправку данных на сервер (не тестировал, могут быть даже синтаксические ошибки):
//У формы должен быть класс "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('Произошла ошибка');
	});
});

Alexandroppolus 08.12.2017 16:05

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

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

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

Цитата:

Сообщение от Nexus
if(++counter>=list.length)

для выполнения параллельных действий есть Promise.all

Nexus 09.12.2017 12:01

Alexandroppolus, спасибо за информацию)
О "FormData" я никогда не слышал, поэтому FileReader.
Цитата:

Сообщение от Alexandroppolus
для выполнения параллельных действий есть Promise.all

Да, затупил, с promise.all было бы удобнее)


Часовой пояс GMT +3, время: 21:57.