
05.12.2010, 20:49
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
Загрузка файла без использования формы
Доброго времени суток всем!
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму. Пользователь вводит множество данных, в том числе выбирает путь к картинке которая должна быть загружена. Жмет кнопку, далее я джавой опрашиваю нужные поля форм и шлю все это ajax на сервер. Облазив интернет нашел технология с iframe, но динамическая загрузка файла мне не нужна, к тому же в каждой строке с данными может быть свой файл. Так вот, как осуществить загрузку этих файлов на сервак. В статье http://xmlhttprequest.ru/#encoding есть интересная строчка:
Цитата:
|
Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.
|
так вот подскажите как можно самостоятельно сформировать тело запроса? логика подсказывает что это можно сделать аналогично вложению в письмо, но для этого надо чтобы был доступ к файлу.
|
|

05.12.2010, 21:02
|
 |
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Пока никак (До пришествия FileAPI и XHR2). Остается только старый iframe.
|
|

06.12.2010, 10:39
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
сделал через ifame
есть форма:
<form id = "formLoad" action="test.php" target="rFrame" method="POST" enctype="multipart/form-data">
<td align = "center">
Фото:<br/>
<input name="loadfile" type="file" size = "10">
<input type="submit" onClick = "createIFrame()" value="загрузить">
<input name="curId" type="hidden" value = "photo_" .$i ."">
</form>
<span id = "photo_" .$i ."">
</span>
функции для загрузки:
function onResponse(d)
{
with(d)
{
eval('var obj = ' + d + ';');
}
//document.getElementById('resUpl').innerHTML = ('Файл ' + obj.filename + (obj.success ? " " : " НЕ ") + "загружен.");
var obj2 = document.getElementById(obj.id);
var masFName = obj.filename;
obj2.innerHTML = masFName;
//var mas_remove = document.getElementById('forFrame');
//mas_remove.innerHTML ="";
}
function createIFrame()
{
var div = document.createElement('div');
div.getAttribute('id');
div.setAttribute('id','forFrame')
var masNframe = Math.floor(Math.random());
div.innerHTML = "<iframe id=\"rFrame\" name=\"" + masNframe + "\" style=\"display: none\"></iframe>";
document.getElementById('formLoad').setAttribute('target', masNframe);
document.body.appendChild(div);
}
<?php
function jsOnResponse($obj)
{
echo '
<script type="text/javascript">
window.parent.onResponse("'.$obj.'");
</script>
';
}
$dir = 'img/';
$name = basename($_FILES['loadfile']['name']);
$file = $dir .$name;
if($success = move_uploaded_file($_FILES['loadfile']['tmp_name'], $file))
{
jsOnResponse("{'filename':'" . $name . "', 'success':'" . $success . "', 'id':'" .$_POST['curId'] ."'}");
}
else
{
echo "загрузка не удалась";
}
?>
в ie все загружается нормально, опера загружать отказывается. событие onSubmit в опере тож не срабатывает, повесил onclick На кнопку. Фрейм создается и на этом процесс останавливается. Что я сделал не так?
Последний раз редактировалось Slavenin, 06.12.2010 в 10:41.
|
|

06.12.2010, 12:05
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
нашел касяк в формуле генерации случайных чисел ее поправил, понял почему опера не грузит, у нее не обновляется параметр target, причем ни через
formFrame.getAttribute('target');
formFrame.target = masNframe;
ни через
formFrame.setAttribute('target', masNframe);
что здесь не так?
function createIFrame()
{
var div = document.createElement('div');
var formFrame = document.getElementById('formLoad');
div.getAttribute('id');
div.id = 'forFrame';
//div.setAttribute('id','forFrame')
m = parseInt(1);
n = parseInt(10000);
var masNframe = Math.floor( Math.random() * (n - m + 1) ) + m;
//alert(masNframe);
div.innerHTML = "<iframe id=\"rFrame\" name=\"" + masNframe + "\" style=\"display: none\"></iframe>";
formFrame.getAttribute('target');
formFrame.target = masNframe;
//formFrame.setAttribute('target', masNframe);
document.body.appendChild(div);
}
Последний раз редактировалось Slavenin, 06.12.2010 в 12:09.
|
|

06.12.2010, 12:17
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
target я тоже победил, но загрузка так и не идет...
|
|

06.12.2010, 13:17
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
все победил, тег form был прописан до тега td, почему-то эксплорер это не смущало, а вот опера запротивилась, перенес его и все заработало
всем спасибо за помощь 
|
|

07.12.2010, 20:25
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
возникла новая странность, есть скрипт которым гружу файлы на сервер:
<?php
header('Content-type: text/html; charset=utf-8');
$dir = 'img/';
$name = rus2translit(basename($_FILES['loadfile']['name']));
$file = $dir .$name;
if($success = move_uploaded_file($_FILES['loadfile']['tmp_name'], $file))
{
echo "loaded";
}
else
{
echo "notloaded";
}
function rus2translit($string)
{
$converter = array(
'а' => 'a', 'б' => 'b', 'в' => 'v',
'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z',
'и' => 'i', 'й' => 'y', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n',
'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u',
'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
'ь' => '', 'ы' => 'y', 'ъ' => '',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
'А' => 'A', 'Б' => 'B', 'В' => 'V',
'Г' => 'G', 'Д' => 'D', 'Е' => 'E',
'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',
'И' => 'I', 'Й' => 'Y', 'К' => 'K',
'Л' => 'L', 'М' => 'M', 'Н' => 'N',
'О' => 'O', 'П' => 'P', 'Р' => 'R',
'С' => 'S', 'Т' => 'T', 'У' => 'U',
'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',
'Ь' => '', 'Ы' => 'Y', 'Ъ' => '',
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
);
return strtr($string, $converter);
}
?>
после загрузки файла с русским именем тест.jpg вижу вместо test.jpg который показывал денвер при тестировании, 1.jpg в чем проблема понять не могу...
|
|

08.12.2010, 12:14
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
доработал функцию создания фрейма, теперь он должен отсылать нормальный заголовок
function createIFrame(idForm)
{
var IdPhoto = idForm.split("_");
m = parseInt(1);
n = parseInt(10000);
var masNframe = Math.floor( Math.random() * (n - m + 1) ) + m;
document.getElementById('photo_'+IdPhoto[1]).innerHTML = "<font color = \"red\"><b>Производится загрузка</b></font>";
var div = mas_CreateElem('div', (masNframe + '_'), '');
div.innerHTML = "<iframe id=\"" +masNframe + "_\" name=\"" + masNframe + "\" style=\"display: none\"></iframe>";
document.getElementById(idForm).getAttribute('target');
document.getElementById(idForm).target = masNframe;
/////////////////
var Iobj = document.getElementsByName(masNframe)[0];
var Idiv = document.createElement('div');
Idiv.getAttribute('id');
Idiv.id = (masNframe + '_D');
Iobj.appendChild(Idiv);
Idiv.innerHTML = "<?php header(\'Content-type: text/html; charset=utf-8\');?>";
}
опера dragonfly в добавленном диве выводит следующий текст: <?php header('content-type:=undefined text/html;=undefined charset=utf-8');?> может я неправильно заголовок передаю?
|
|

08.12.2010, 12:41
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от Slavenin
|
Idiv.innerHTML = "<?php header(\'Content-type: text/html; charset=utf-8\');?>";
|
Да это бред какой-то. Сами подумайте теперь почему....
|
|

08.12.2010, 13:58
|
Кандидат Javascript-наук
|
|
Регистрация: 20.11.2010
Сообщений: 143
|
|
подумал, понял, с клиента отправить заголовок нельзя, поэтому я не прав, а вообще основной вопрос заключается в том как загрузить файл с русским именем? ради чего собственно все это и затевалось.
|
|
|
|