powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / AJAX и upload через PHP
9 сообщений из 9, страница 1 из 1
AJAX и upload через PHP
    #35171751
burton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть форма, преглашающая пользователя выбрать файл для аплоада.
При клики на сабмит вызывается не php-скрипт, а Java-функция (расположенная в другом файле).
Сделано это так, потому что я пишу раздел сайта, используя ajax.

То есть фактически получается такая цепочка:
1. При клике на сабмит вызывается Java-функция (метод при этом в форме стоит POST).
2. Вызванная ф-я реализует последовательно весь ajax-механизм, вызывая в конечном итоге (после успешного статуса) php-скрипт/
3. вызванный php-скрипт проверят POST и не находит там полей формы, а кроме того $_FILES тоже пуст (естественно).

Собственно вопрос: как мне через ajax-механизм реализовать аплоад файла?
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35172628
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burton1. При клике на сабмит вызывается Java-функция (метод при этом в форме стоит POST).
У меня подозрение, что все же не Java-функция, а javascript-функция ...

У меня полгода назад была подобная проблема, при этом мои формы (весь контент) подгружались через AJAX и еще я хотел использовать элемент <input type="file"> со своей кнопкой, которая по стилю бы подходила странице. Я это сделал, вот вырезки кода:

Форма:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<form method="post" name="my_submit" id="my_submit" enctype="multipart/form-data" onsubmit="var url = {myURL} + '?subAction=upload_file'; sendForm(this, url, uploadComplete); return true;">
<table align="center" border="0" cellpadding="0" cellspacing="8">
	{content all cells, inputs, checks, radio, selects}
	<tr>
		<td class="body_pink_cell">File to upload:</td>
		<td>
<div class="fileinputs" style="position: relative; width: 300px; height: 27px;">
<input type="file" class="file" name="file_upload" id="file_upload" style="width: 85px; margin: 0; margin-top: 2px; height: 22px; margin-left: 220px; cursor: hand; cursor: pointer;" onchange="clearError();">
</div>
		</td>
	</tr>
	<tr><td><img id="but_submit" style="cursor: hand; cursor: pointer;" src="images/btn_submit_form_dark.png" width="101" height="27"></td>
	</tr>
	<tr><td><input style="visibility: hidden;" id="submit_form" name="submit_form" type="submit" value="submit"></td>
	</tr>
</table>
Скрипт на странице:
Код: plaintext
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.
var W3CDOM = (document.createElement && document.getElementsByTagName);
function initFileUploads() {
	if (!W3CDOM) return;
	var fakeFileUpload = document.createElement('div');
	fakeFileUpload.className = 'fakefile';
	var overInput = document.createElement('input');
	overInput.disabled = "true";
	fakeFileUpload.appendChild(overInput);
	var image = document.createElement('img');
	image.id = "browse_button";
	image.src='images/btn_browse_dark.png';
	image.style.width = "87px";
	image.style.height = "27px";
	image.style.verticalAlign = "top";
	image.onmouseover = function() {document.getElementById('browse_button').src = 'images/btn_browse_light.png';};
	image.onmouseout = function() {this.src = 'images/btn_browse_dark.png';};
	fakeFileUpload.appendChild(image);
	var x = document.getElementsByTagName('input');
	for (var i =  0 ; i < x.length; i++) {
		if (x[i].type != 'file') continue;
		if (x[i].getAttribute('noscript')) continue;
		if (x[i].parentNode.className != 'fileinputs') continue;
		x[i].className = 'file hidden';
		var clone = fakeFileUpload.cloneNode(true);
		x[i].parentNode.appendChild(clone);
		x[i].relatedElement = clone.getElementsByTagName('input')[ 0 ];
		if (x[i].value) x[i].onchange();
		x[i].onchange = function() {this.relatedElement.value = this.value;};
		x[i].onmouseout = function() {document.getElementById('browse_button').src = 'images/btn_browse_dark.png'; this.relatedElement.value = this.value;};
		x[i].onmouseover = function() {document.getElementById('browse_button').src = 'images/btn_browse_light.png';};
	}
}
document.getElementById("but_submit").onclick = function() {
	var data = [];
	data["subAction"] = "myAction";
	data["value1"] = document.getElementById("input1").value;
	data["value2"] = document.getElementById("select3").value;
	{все поля для отправки на сервер - для проверки на валидность}
	updateContentWithData(data); {функция отправки значений и определения дальнейшего шага в зависимости от ответа сервера - без отправки самого файла!!!, только его имя}
	if (document.getElementById("file_upload").value != "")
		document.getElementById('submit_form').click();
};
Стили для создаваемого элемента:
Код: plaintext
1.
2.
3.
div.fakefile {position: absolute; top: 0px; left: 0px; width: 350px; padding:  0 ; margin:  0 ; z-index:  1 ; line-height:  90 %;}
div.fakefile input {margin-bottom: 5px; margin-left:  0 ;}
input {border: solid 1px #7f9db9; width: 216px; height: 18px; font-family: Verdana, Tahoma, Arial; color: # 666 ; font-size: 10pt;}
input.file.hidden {position: relative; text-align: right; -moz-opacity:  0 ; filter: alpha(opacity:  0 ); opacity:  0 ; z-index:  2 ; float: left;}
Скрипт в js-файле (не получилось вызывать получать динамически подгруженные функции, поэтому вынес во внешний файл):
Код: plaintext
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.
function createIFrame() {
	var frame_id = 'frame' + Math.floor(Math.random() *  99999 );
	var div = document.createElement('div');
	div.innerHTML = '<iframe style="display:none" src="about:blank" id="' + frame_id + '" name="' + frame_id + '" onload="sendComplete(\'' + frame_id + '\')"></iframe>';
	document.body.appendChild(div);
	return document.getElementById(frame_id);
}
function sendForm(form, url, func) {
	if (!document.createElement) return;
	if (typeof(form) == "string") form = document.getElementById(form);
	var iframe = createIFrame();
	iframe.onSendComplete = function() {func(getIFrameXML(iframe));};
	form.setAttribute('target', iframe.id);
	form.setAttribute('action', url);
	form.submit();
}
function sendComplete(frame_id) {
	var iframe = document.getElementById(frame_id);
	if (iframe.onSendComplete && typeof(iframe.onSendComplete) == 'function')
		iframe.onSendComplete();
}
function getIFrameXML(iframe) {
	var doc = iframe.contentDocument;
	if (!doc && iframe.contentWindow) doc = iframe.contentWindow.document;
	if (!doc) doc = window.frames[iframe.id].document;
	if (!doc) return null;
	if (doc.location == "about:blank") return null;
	if (doc.XMLDocument) doc = doc.XMLDocument;
	return doc;
}
function uploadComplete(doc) {
	if (!doc) return;
}

На серваке у меня стоит Java (jsp-servlet), поэтому я использую библиотеку org.apache.commons.fileupload от Apache - суперкомпактная штучка, намного удобнее, чем ручная обработка файлового потока, баундрис и прочего.
Единственное, что надо доделать - сама отправка файла (функция document.getElementById('submit_form').click()) должна вызываться после получения положительного ответа с сервера на валидность всех полей, а у меня файл отправляется в любом случае ... просто руки не дошли.

burton, поищи (или сделай) скрипт получения файла на сервере. Не забудь, что это делается не автоматически, а к request'у цепляется файловый поток, который надо выцепить и записать на диск. Инфы для PHP намного больше, так что проблемы быть не должно. Вот примерчик.
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35216538
burton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, IDVsbruck!!! Почитал поразбирался. Но я реализовал передачу файлика без перезагрузке странички при помощи iframe. Типа:
Код: plaintext
1.
2.
<form enctype='multipart/form-data' method='post' onsubmit="AddPhoto.php" target="iframe_1">
....
Ну эт не AJAX, но те же яйца, тоьлко в профиль.
Вообщем-то меня такой вариант устроил вполне. Сам движок AJAX в остально у меня отлажен, так что я решил: AJAX + upload через iframe = заипца.
А тебе (IDVsbruck) ещё раз спасибо за участие!!!)
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35216543
burton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл сказать, что сам iframe невидимый - в этом-то и фига
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35219250
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burtonЗабыл сказать, что сам iframe невидимый - в этом-то и фига
Не забудь, что ифраме нельзя делать display:none, а нужно ширину и высоту в 0 поставить, а то не во всех браузерах зафурычит.
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35222681
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да бл*, сколько же можно самим писать велосипед?
http://www.google.ru/search?q=prototype.js
не надо сочинять ифреймы , не нужно придумывать хитрые протоколы взаимодействия, совершенно необязательно каждый раз писать document.getElemenyById('test') , есть запись $('test') в этой библиотеке.. ну конечно, ради прикола надо попробовать самому всё сделать через ифрэйм или через добавление нового скрипта в хэд, но это только первый раз! потом нужно пользоваться готовыми решениями! ещё рекомендую ExtJs
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35222699
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, во-первых, даже prtotype отсылает "ajax-овским способом" посредством iframe. Во-вторых, не все любят использовать фреймворки - где объем, где нежелание разбираться. В-третьих - смысл использовать внешний фреймфорк ради сокращения кода на десяток-другой символов? А даже если так, то можно просто самому написать функцию $(id).
И никто велосипед не изобретает. Конструкция уже стара ... А разобраться в работе не грех даже достаточно "продвинутым" программерам.
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35222809
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeusTheTrueGodда бл*, сколько же можно самим писать велосипед?
http://www.google.ru/search?q=prototype.js
не надо сочинять ифреймы , не нужно придумывать хитрые протоколы взаимодействия, совершенно необязательно каждый раз писать document.getElemenyById('test') , есть запись $('test') в этой библиотеке.. ну конечно, ради прикола надо попробовать самому всё сделать через ифрэйм или через добавление нового скрипта в хэд, но это только первый раз! потом нужно пользоваться готовыми решениями! ещё рекомендую ExtJs

Я не так давно изучал код Prototype и upload там нет.
В jQuery есть не реализован не самым лучшим способом, т.к. формируется фрейм для target,
но посылается из основного документа, а следовательно юсер интерфейс подвисает.
Здесь предложили варианты как генерить фреймы и from и target. Это решение лучше.

Тем-то JavaScript и отличается от Си-Диего, что Вы можете поспорить с лучшими мировыми лидерами, а не использовать Гбайтный готовый функционал.
...
Рейтинг: 0 / 0
AJAX и upload через PHP
    #35222810
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ксати по архитектуре Prototype.
Да и jQuery.
Эти библиотеки засоряют глобальное пространство тривиальными именами, из которых Вы обно уже упомянули - "конфетку". А еще есть Prototype, Class ...
Это приводит к тому что использовать совместно такие библиотеки как Prototype,jQuery, jsolait просто невозможно.
В то же время такие библиотеки как doji, YUI - привязыват имена в доменном стиле и используют всего одну глобальную переменную - dojo и YAHOO - соответственно. Так кто из них хороший?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / AJAX и upload через PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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