Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Ajax загрузка файла на сервер / 25 сообщений из 29, страница 1 из 2
17.12.2013, 11:41
    #38503239
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Текстовые данные грузятся грузятся без проблем. А вот картинку как грузить?

HTML форма:
Код: html
1.
2.
3.
4.
5.
6.
7.
<form action="" enctype="multipart/form-data" method="POST">
   ///.........................................................
................................................................
.............................................................///

<input type='file' name='pictures[]' id='userfile_1'><input type='file' name='pictures[]' id='userfile_2'>
</form>



К странице пристёгиваю .js фаил
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$(document).ready(function(e)
{	 
    $("#addPanel").

    $("#submit").click(function(){ 
		.....................................................................................


.....................................................................................................		
		$.ajax({ 
            url:"engine/saveNewSubject.php", 
		    type: 'get',
            data:{ category:rublic, city:current_city, rooms:current_rooms, c_float:current_float, t_float:total_flaot, place:place, age:age, mmad:mmad, price:price, lift:lift, parking:parking, cammon:cammon, boiler:boiler, furniture:furniture, free_time:free_time, arnona:arnona, vaad_bait:vaad_bait, title:title, bodyText:bodyText },
            success:function(print){
                alert(print);			
            } 
        }) 		
    });

});



ну и в файле /saveNewSubject.php

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
...........................................................................
...........................................................................
 foreach ($_FILES["pictures"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
            $name = $_FILES["pictures"]["name"][$key];
            move_uploaded_file($tmp_name, "foto/$name");
        }
    }



пытался в .js фаиле менять на type: 'post', - непомогло.

в чём может быть причина????
...
Рейтинг: 0 / 0
17.12.2013, 12:00
    #38503280
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
я такого не делал, у нас на работе для этого uploadify используется

да, а что если просто указать форме в качестве target невидимый iframe
и сделать ей обычный submit ?
...
Рейтинг: 0 / 0
17.12.2013, 12:05
    #38503288
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
на сайте размещаются рекламные обьявления а к ним иногда прилогаются фотою во и прашиваю как это с фджаксом подружить.

то что вы предлогаете както не удобоваримо получается!

Запрос проходит но в PHP файле я проверял print_r($_FILES); - показывает что пусто
...
Рейтинг: 0 / 0
17.12.2013, 12:07
    #38503294
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
а в форме сделал обычный submit
...
Рейтинг: 0 / 0
17.12.2013, 12:11
    #38503302
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Areostarа в форме сделал обычный submitвот и отлично
...
Рейтинг: 0 / 0
17.12.2013, 12:41
    #38503356
Areostar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Но почему тогда $_FILES - пустой приходит
...
Рейтинг: 0 / 0
17.12.2013, 12:45
    #38503361
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
enctype правильный
submit обычный, без всяких ajax

я не знаю почему $_FILES пустой
спросите на форуме по php, может там знают...
...
Рейтинг: 0 / 0
17.12.2013, 12:48
    #38503370
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Потомучто аякс не умеет передавать файлы. Ферштейн?
...
Рейтинг: 0 / 0
17.12.2013, 14:47
    #38503639
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
ShSergeПотомучто аякс не умеет передавать файлы. Ферштейн?Эээ... наверное ты имел ввиду XHR? Пост формы с файлом в ифрейм как бы еще никто не запрещал.
...
Рейтинг: 0 / 0
17.12.2013, 16:35
    #38503891
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
ShSergeПотомучто аякс не умеет передавать файлы. Ферштейн?
Как это не умеет, а как-же браузер передаёт?
Нужно всего-лишь самому сформировать структуру POST-запроса вместо браузера
(а это обычный текст со вставками-бинарными данными), можно даже перевести бинарные в формат base64 с помощью .readAsDataURL()

Для этого нужно знать как формировать POST-запрос, а именно:
- использовать разделитель границ передаваемых полей - boundary - так называемый уникальный "хеш".
- указывать Content-Type: multipart/form-data

Вот старый пример прямой передачи файла с ручным формированием POST-запроса на чистом JS:
9984722 ,
из которого можно даже убрать лишнее, и добавить, например, .readAsDataURL() - хотя есть нюансы, но они решаются.
...
Рейтинг: 0 / 0
17.12.2013, 17:21
    #38503987
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
asws,

Нихрена он не передаёт. Но, через задний проход можно сделать. Я даже штук десять примеров могу написать.
...
Рейтинг: 0 / 0
17.12.2013, 17:31
    #38504007
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
ShSerge,

Возможно, что-то не так у вас с сервером (слеши и т.д.) или с примером, я-же писал, что есть нюансы.
Но они решаемы, я несколько лет так делаю, любой POST стараюсь передавать именно таким образом, включая загрузку файлов.
Этото пример нуждается в доработке под конкретную ситуацию.

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

Например, я сталкивался с проблемой передачи рисунков в формате dase64 (с помощью .readAsDataURL() ) -
- у меня передаются корректно только jpeg-файлы.
Это нюансы, зависящие от способа обработки как на клииенте, так и на сервере.
...
Рейтинг: 0 / 0
17.12.2013, 17:35
    #38504015
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
кроме варианта base64 есть ещё xhr2
у него 2 возможности: upload для единичного файла и FormData для формы.

но все эти вкусности не доступны в IE9-
так что скрытый фрейм - пока единственный универсальный вариант.
...
Рейтинг: 0 / 0
17.12.2013, 17:37
    #38504026
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
aswsНапример, я сталкивался с проблемой передачи рисунков в формате base64 (с помощью .readAsDataURL() ) -
- у меня передаются корректно только jpeg-файлы.странно. весьма.
на этом форуме в "быстром ответе" есть передача base64 (если картинка драгндропнулась) - всё норм. работает, все форматы.
...
Рейтинг: 0 / 0
17.12.2013, 17:43
    #38504038
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Яростный МечaswsНапример, я сталкивался с проблемой передачи рисунков в формате base64 (с помощью .readAsDataURL() ) -
- у меня передаются корректно только jpeg-файлы.странно. весьма.
на этом форуме в "быстром ответе" есть передача base64 (если картинка драгндропнулась) - всё норм. работает, все форматы.всё верно, но я не стал тогда разбираться, кто виноват - шаред-хостинг или код/браузер, так как клиенту была нужна админка для загрузки именно jpeg-файлов.
Но такая проблема возникала, так что у кого-то приведённый пример может заработать, у кого-то нет.

Смысл этого примера - показать, как может вручную формироваться POST-запрос.
В примере используется только часть возможностей, а можно делать полностью весь POST, включая заголовки,
то-есть использовать в конечном итоге только метод .send() браузера...
...
Рейтинг: 0 / 0
17.12.2013, 21:11
    #38504274
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Вот состряпал на коленке - передаёт корректно любые файлы через base64.
Просьба, для желающих проверить - отпишитесь пожалуйста, как работает.
В IE9 не могу сейчас посмотреть, но вроде в нём НЕ будет работать.
Используется обычный XMLHttpRequest, который позволяет передавать любые файлы без форм и iframe.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?php
 if (isset($_FILES['my_file'])) {
	$uploadfile = basename($_FILES['my_file']['name']);
	if (move_uploaded_file($_FILES['my_file']['tmp_name'], 'tmp')) {
	    $my_file=@file_get_contents('tmp');
		$pos=strpos($my_file,';base64,'); if(!$pos) { print 'error'; exit; }
		$my_file=base64_decode(substr($my_file,$pos+8)); // Вырезка служебных символов "data: ... ;base64,"
		$my_fh=fopen($uploadfile,'w'); if ($my_fh==False) { print 'error'; exit; }
		rewind($my_fh); if (-1==fwrite($my_fh,$my_file)) { print 'error'; fclose($my_fh); exit; }
		ftruncate($my_fh,ftell($my_fh)); fflush($my_fh); fclose($my_fh);
		print 'ok';
	} else {
		print 'error';
	}
	exit;
}
?>

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript">
var my_reader=null, my_interval=null, my_queryHttp=0, my_HTTP=f_createXmlHttp(), my_file;

function f_upload() {
	var min=1000, max=2000000;
	my_file=document.getElementById("my_id_file").files;
	if (!my_file) { alert('Смените браузер на более новую версию, или на современный.'); return false; }
	my_file=my_file[0]; if (!my_file || !my_file.name) { alert('Укажите (выберите) файл'); return false; }
	if (my_file.size<min || my_file.size>max) { alert('размер файла вне допустимых размеров'); return false; }
	my_reader = new FileReader();
	my_reader.readAsDataURL(my_file); // содержимое любого файла в бинарном виде
	my_reader.onloadend=function(){
		var b=(Math.round(Math.random()*90000000)).toString(), r='--'+b+'\r\n', t;
		if	(!my_HTTP || my_queryHttp!=0) return;
		try
			{
				my_queryHttp=1;
				my_HTTP.open('POST','test2.php',true);
				my_HTTP.onreadystatechange=null;
				my_HTTP.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+b);
				t = r+'Content-Disposition: form-data; name="my_file"; filename="'+my_file.name+'";\r\nContent-Type: '+my_file.type+'\r\n\r\n';
				t += my_reader.result+'\r\n'+'--'+b+'--\r\n';
				t = 'Content-Length: '+t.length+'\r\n\r\n'+t;
				my_HTTP.send(t);
			}
		catch (e) { my_queryHttp=0; alert('Ошибка. Не удалось отправить POST-запрос.'); }
	}
	my_interval=setInterval(function(){f_my_RequestStateChange();},100);

}

function f_my_RequestStateChange() { // здесь все небходимое для принятия ответа сервера
	var ret,st;
	try {
		if (my_HTTP.readyState==4)
		{
			st=my_HTTP.status;
			if (st==200)
			{
				ret=my_HTTP.responseText;
				if (ret=='ok') { alert("upload complete"); }
				if (ret=='error') { alert("upload error"); }
			} else alert('network error. status:'+st.toString());
			my_queryHttp=0; my_reader=null; if (my_interval) clearInterval(my_interval); my_interval=null;
		}
	}  catch (e) { my_reader=null; if (my_interval) clearInterval(my_interval); my_interval=null; alert('Ошибка приема ответа'); }
}

function f_createXmlHttp() {
	var i,v,x,a='MSXML2.',b='XMLHTTP';
	try	{ x=new XMLHttpRequest(); }
	catch (e)
	{
		v=new Array(a+b+'.6.0',a+b+'.5.0',a+b+'.4.0',a+b+'.3.0',a+b,'Microsoft.'+b); a=v.length;
		for (i=0; i<a && !x; i++) { try { x=new ActiveXObject(v[i]); } catch (e) {} }
	}
	return (!x)?false:x;
}
</script>
</head>
<body>
<input id="my_id_file" type="file" /><br>
<input id="my_send" type="button" value="upload file" onclick="if (my_reader==null && my_interval==null) f_upload()" />
</body>
</html>
...
Рейтинг: 0 / 0
17.12.2013, 21:20
    #38504283
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Примечание: реальное имя php-файла подставлять сюда вместо 'test2':
my_HTTP.open('POST','test2.php',true);
...
Рейтинг: 0 / 0
17.12.2013, 21:37
    #38504297
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
aswsВ IE9 не могу сейчас посмотреть, но вроде в нём НЕ будет работать.не будет - там нет FileReader.

А вообще - необходимость подобного кода нынче весьма узкая. Должен быть FileReader, но при этом отсутствовать FormData. Если верить MDN, то единственный случай на десктопе - FF 3.6. А в целом у FormData поддержка немного лучше
...
Рейтинг: 0 / 0
17.12.2013, 21:44
    #38504306
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
другой момент - если берем содержимое файла в base64, то нет смысла его отправлять именно как "multipart/form-data".
это строка, можно отправить как угодно.
к тому же серверный код теперь не может обрабатывать сабмит формы с файлом - там не будет никакого base64
...
Рейтинг: 0 / 0
17.12.2013, 21:47
    #38504316
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Да, это понятно, дело в том, что можно формировать из самого JS "файлы с данными", и это будет работать даже из IE8.
А формат base64 используется для одновременной передачи 100500 полей через один запрос, в том числе и файлов.
...
Рейтинг: 0 / 0
17.12.2013, 21:51
    #38504319
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Формат base64 используется для кодирования непечатных символов печатными. Передавать одновременно любое количество полей и файлов можно и без таких заморочек.
...
Рейтинг: 0 / 0
17.12.2013, 21:52
    #38504320
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
то-есть по сути отправляется через .send() строка, которую обрабатывает движок того или иного браузера,
и делать конкатенацию строки с бинарными данными - риск, как-бы глюков не было...
...
Рейтинг: 0 / 0
17.12.2013, 22:00
    #38504325
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
asws,

я к тому, что те строковые данные, которые у тебя есть (файлы в base64, тексты) можно с тем же успехом отправить как "application/x-www-form-urlencoded" - всё равно файлы на сервере придется получать из base64

тогда в пхп вместо $_FILES использовать $_POST
...
Рейтинг: 0 / 0
17.12.2013, 22:07
    #38504333
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
aswsи делать конкатенацию строки с бинарными данными - риск, как-бы глюков не было...тут ещё есть такой момент: "multipart/form-data" - это в любом случае отправка бинарных данных.
если в твоей строке все символы <128, то все норм., а если есть, например, русские буквы? что будет отправлено? FormData, к примеру, всегда преобразует в utf8
...
Рейтинг: 0 / 0
17.12.2013, 22:13
    #38504339
asws
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ajax загрузка файла на сервер
Яростный Меч,

Несколько лет всё корректно в разных браузерах, работаю только с UTF-8

Реальных ситуаций много, поэтому приведённый мной способ может применяться в некоторых случаях.
Например, когда php-код не знает, что файлы - это не обязательно именно загруженные лично пользователем...

Я привёл это способ и обратил внимание на пользу знаний что такое POST изнутри,
потому что сколько видел тем, почему-то утверждается, что XMLHttpRequest этого не может,
но дело не в XMLHttpRequest, он-то как раз позволяет описать и передать что угодно,
дело на самом деле в FileAPI, поддерживаеется он браузером или нет.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Ajax загрузка файла на сервер / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]