Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.12.2010, 20:49
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

Загрузка файла без использования формы
Доброго времени суток всем!
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму. Пользователь вводит множество данных, в том числе выбирает путь к картинке которая должна быть загружена. Жмет кнопку, далее я джавой опрашиваю нужные поля форм и шлю все это ajax на сервер. Облазив интернет нашел технология с iframe, но динамическая загрузка файла мне не нужна, к тому же в каждой строке с данными может быть свой файл. Так вот, как осуществить загрузку этих файлов на сервак. В статье http://xmlhttprequest.ru/#encoding есть интересная строчка:
Цитата:
Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.
так вот подскажите как можно самостоятельно сформировать тело запроса? логика подсказывает что это можно сделать аналогично вложению в письмо, но для этого надо чтобы был доступ к файлу.
Ответить с цитированием
  #2 (permalink)  
Старый 05.12.2010, 21:02
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Пока никак (До пришествия FileAPI и XHR2). Остается только старый iframe.
Ответить с цитированием
  #3 (permalink)  
Старый 06.12.2010, 10:39
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 06.12.2010, 12:05
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 06.12.2010, 12:17
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

target я тоже победил, но загрузка так и не идет...
Ответить с цитированием
  #6 (permalink)  
Старый 06.12.2010, 13:17
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

все победил, тег form был прописан до тега td, почему-то эксплорер это не смущало, а вот опера запротивилась, перенес его и все заработало
всем спасибо за помощь
Ответить с цитированием
  #7 (permalink)  
Старый 07.12.2010, 20:25
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 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 в чем проблема понять не могу...
Ответить с цитированием
  #8 (permalink)  
Старый 08.12.2010, 12:14
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 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');?> может я неправильно заголовок передаю?
Ответить с цитированием
  #9 (permalink)  
Старый 08.12.2010, 12:41
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Slavenin
Idiv.innerHTML = "<?php header(\'Content-type: text/html; charset=utf-8\');?>";
Да это бред какой-то. Сами подумайте теперь почему....
Ответить с цитированием
  #10 (permalink)  
Старый 08.12.2010, 13:58
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

подумал, понял, с клиента отправить заголовок нельзя, поэтому я не прав, а вообще основной вопрос заключается в том как загрузить файл с русским именем? ради чего собственно все это и затевалось.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка файла без AJAX. B~Vladi Internet Explorer 36 25.01.2011 21:05
Не работает корректно загрузка файла в IE rroman Javascript под браузер 0 08.10.2010 19:12
загрузка джаваскрипта file by file с номером ревизии(последней) в урле для файла sergdev Ваши сайты и скрипты 7 13.04.2010 10:52
Автоматическая отправка формы через JavaScript без использования body onload pavluxa09 Общие вопросы Javascript 0 17.11.2009 15:55
Загрузка файла AJAX'ом - почему-то переводит на страницу загрузки файла .andreev AJAX и COMET 13 21.10.2009 22:25