Формирование POST запрпоса c JavaScript
Допустим я хочу передать следующий заголовок:
Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n
Content-Length: 2000\r\n\r\n
--1BEF0A57BE110FD467A\r\n
Content-Disposition: form-data; name="news_file"; filename="news.txt"\r\n
Content-Type: application/octet-stream\r\n
Content-Transfer-Encoding: binary\r\n\r\n
nuploadfile\r\n
--1BEF0A57BE110FD467A--\r\n
В JavaScript делаю следующее:
xmlhttp.open("POST", "http://www.dubmon.com/ed/upload/example_upload.php", false);
xmlhttp.setRequestHeader("Content-Type", "multipart/form-data; boundary=1BEF0A57BE110FD467A");
xmlhttp.setRequestHeader("Content-Length", "2000");*/
xmlhttp.setRequestHeader("--1BEF0A57BE110FD467A\r\nContent-Disposition", "form-data; name='news_file'; filename='news.txt'\r\n");
xmlhttp.setRequestHeader("Content-Type", "application/octet-stream\r\n");
xmlhttp.setRequestHeader("Content-Transfer-Encoding", "binary\r\n\r\nuploadfile\r\n--1BEF0A57BE110FD467A--\r\n");
xmlhttp.send(formData);
Правильно ли я делаю, ибо не работает.
Если что-то не работает, нужно начать разбор скрипт с самого начала на каждом шаге убеждаясь, что в предыдушем были созданы все объекты и их свойства приняли нужные значения.
Поэтому для начало стоило бы убедиться, что объект XMLHttpRequest/XMLHTTP у тебя создается.
К примеру таким скриптом:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>AJAX</title>
<script type="text/javascript" language="javascript">
function httpRequest() {
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
alert("Используется XMLHttpRequest объект");
} else if (window.ActiveXObject) {
request=new ActiveXObject("Msxml2.XMLHTTP");
alert("Используется XMLHTTP объект dthcbb 2");
if (!request) {
request=new ActiveXObject("Microsoft.XMLHTTP");
alert("Используется XMLHTTP объект dthcbb 1");
};
} else {
alert("Объект XMLHttpRequest/XMLHTTP создан не был");
};
};
</script>
</head>
<body onload="httpRequest()">
</body>
</html>
Теперь у нас есть объект request с которым и нужно работать. Он уже не зависит от браузера на клиенте. А твой же код с xmlhttp будет понятен ТОЛЬКО IE. Нужно создавать кросс-браузерные приложения которые будут одинаково работать в любом браузере.
Допустим я разобрался уже с чисто своим вопросом.
Возник другой: http://forum.codenet.ru/showthread.php?t=28008
Кода получится, обязательно напиши, сколько всетаки кругов с бубном ты отпрыгал %)
var len = krugov.buben
if(len < 50) window.writeln("Молодец!");
else window.writeln("Для того-то этот пост тут и висит.");
Вперёд.
[/QUOTE]
И зачем?! Upload делается через форму. Как описано в HTML специфакации и JavaScript тут соверешнно не причем. Не стоит изобретать велосипед.
Так что полностью поддерживаю shaelf-а.
"Не умножайте сущностей сверх необходимости" © Оккам. ;)
Ок. Упрощу вопрос.
Как все знают форма с input type="file при нажатии на "Submit" отправляет серверному скрипту POST-запрос. Все что я хочу - создать функцию, которая сформирует и отправит точно такой же POST запрос. Грубо говоря, я хочу заного изобрести велосипед и усложнить простое, но поверьте, мне это необходимо.
Я точно знаю что XMLHTTPRequest на это способен. Остается только найти человека, который знает, как решить мою проблему.
Если уверен, то в чем проблемы? Если не знаешь, то не утверждай, того, что не знаешь ;)
Во-вторых. Как скприпт узнает, какой файл нужно перадавать? Ему пользователь указывает. Но как?
Даже изобретение велосипеда заново должно быть обоснованным. Опиши ситуацию, для ЧЕГО и КОГДА нужен подобный скрипт.
[SIZE="3"]Следующий!!![/SIZE]
Столкнулся с подобной проблемой и так и не смог найти в ответа.
Есть UserControl, на нём лежит FileUpload. Как с помощью javaScript
отправить POST запрос на специальную страничку FileUploader.aspx и
передать через контекст контрол FileUpload (или файл из него) ?
Суть в том, что есть страничка (ASP.NET, C#), на ней есть панель с
ЮзерКонтролом, которая при помощи ModalPopupExtension выводится
на экран. В Юзер контроле есть FileUpload и мне надо загружать картинки на сервер без перегрузки страницы (FileUpload отправляет данные на сервер только при полном постбэке).
но я не знаю как запостить туда контрол FileUpload (или файл из него)
Я могу методом GET передать в страничку из <iframe> строковае значения, а вот как файл передать я не знаю :(
<input type="file" name="fileSet" />
<input type="button" value="GO" />
</form>
<iframe name="iframe001" style="display:none;"></iframe>
Я снова боюсь ошибиться, но помоему вложенные формы не работают?
внутри этой формы - разные плэйсХолдеры, в которых я и вывожу свои
странички.
Получается, что если я в ЮзерКонтроле, который лежит на одной из
страниц пропишу ещё один тэг <form /> - то получится
вложенные формы
эти теги будут на разных HTML-страницах следовательно ни о каком вложении нет речи.
Очень тяжело понимать что вы имеете ввиду поскольку вы используете для объяснения проблем с Web термины прикладного системного программирования
для того что бы обработать файл - нужен полный постБэк на сервер.
А мне нельзя перегружать страницу целиком.
Обойти это можно спомощью скрытого iframe и постить на другую страницу. Как это сделать без <form> я не могу найти
Так получилось, что в нашем проекте не используется jQuery, да и я с ним не знаком. Хотелось бы узнать - есть ли способ решить эту проблему
без посторонней либы, так как по сути она нужна только в этом моменте... И если всё же стОит делать через jQuery, то можно ли у вас попросить пару ключевых слов, что бы нагуглить нужное мне решение -
сам рыская по этой либе я потрачу много времени на поиск
function someFunc()
{
var req = getRequest(); // = new XMLHttpRequest(), например.
if (req)
{
var params = "path=ff&name=dd";
req.open("POST", "../FileUploader.aspx", true);
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.send(params);
}
}
Я так понимаю, что эта js-функция отправит пост запрос в FileUploader.aspx (хотя не уверен что это рабочий код)
А можно таким же образом отправить файл?
зачем тебе "вложенные формы"? это может означать только то, что у вас слегка неверно построено дерево элементов. Форма в форме выполнится не сможет... точнее, результат будет не верным.
стоит привести кусок HTML уже итоговой страницы. тогда можно будет разбираться.
[HTML]
<%@ Master Language="C#" ...
<%@ Register TagPrefix="asp" ...
<head... />
<body>
<form runat="server ...>
<asp:ContentPlaceHolder ID="mainContentPlaceHolder" runat="server"/>
</form>
</body>
[/HTML]
Images.aspx:
[HTML]
<%@ Page Language="C#" MasterPageFile="~/Main.Master"...
<%@ Register TagPrefix="uc" TagName="myControl" Src="~/Controls/MyControl.ascx"%>
<asp:Content ContentPlaceHolderID="mainContentPlaceHolder" ...
<asp:Panel ...
<uc:myControl... />
</asp:Panel>
<ajaxToolkit:ModalPopupExtender .... бла-бла : выводим myControl как модальное окошко.
[/HTML]
MyControl.ascx:
[HTML]
<%@ Control Language="C#"
<input type="file" id="fileDialog" />
<asp:Button runat="server" Text="Upload" onClick="OnAddImageButtonClick" onClientClick="java script:sendImage();"/>
[/HTML]
и теперь в MyControl.ascx надо правильно написать js function sendImage()
типа:
function sendImage()
{
var req = getRequest();
req.open("POST", "../FileUploader.aspx", true);
req.setRequestHeader("Content-type", "multipart/form-data...);
req.setRequestHeader("Connection", "close");
req.setRequestHeader("Content-length", requestbody.length);
req.send(params);
}
</script>
я так понимаю, что мне надо что то типа :
http://www.captain.at/ajax-file-upload.php
здесь есть пример, но у меня он упал на
строке
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
Если кто сможет подкорректировать мою js функцию - буду очень признателен
<!-- тут вставлен контрол выбора файла картинки -->
<input type="file" name="image" />
<input type="submit" name="image_upload" value="Upload" onclick="return submitUploadForm();" />
<!-- /// -->
</form>
<iframe name="uploader" style="display: none;" />
дык вот... когда ты жмакаешь на кнопку Upload, советую сделать следующее:
{
el = document.getElementById('uni_form');
if (el) {
el.target="uploader";
//el.action = "твой_скрипт_для_аплоада.php"; // например
// тут что хочешь делаешь, скрываешь форму и пр. фишки визуальные )
return true;
} else {
// ошибка, форма не найдена O_o
return false;
}
}
в скрипте, который получит твой image, проверяешь, если переменная image_upload != пустой строке, то дальше читаешь переменную с файлом (image), пишешь куда надо и прочее.
т.е. получается никаких вложенных форм, никаких излишеств. У тебя есть одна форма, таргет и экшн которой подменяется c помощью JS для разных нужд. Если я правильно тебя понял, то в этой форме могут быть не только image upload секции.
PS: надеюсь получилось объяснить )
так как это всё у меня в ЮзерКонтроле происходит =\