Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Загрузка файла без использования формы
Форумы портала PHP.SU » PHP » Программирование на PHP » Загрузка файла без использования формы

Страниц (1): [1]
 

1. Slavenin - 05 Декабря, 2010 - 20:00:44 - перейти к сообщению
Доброго времени суток всем!
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму. Пользователь вводит множество данных, в том числе выбирает путь к картинке которая должна быть загружена. Жмет кнопку, далее я джавой опрашиваю нужные поля форм и шлю все это ajax на сервер. Облазив интернет нашел технология с iframe, но динамическая загрузка файла мне не нужна, к тому же в каждой строке с данными может быть свой файл. Так вот, как осуществить загрузку этих файлов на сервак. В статье http://xmlhttprequest[dot]ru/#encoding есть интересная строчка:
Цитата:
Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.
так вот подскажите как можно самостоятельно сформировать тело запроса? логика подсказывает что это можно сделать аналогично вложению в письмо, но для этого надо чтобы был доступ к файлу.
2. ALEN - 05 Декабря, 2010 - 23:13:56 - перейти к сообщению
Slavenin
В любом случае формы + учите html + php и потом javascript - и уже на его основе AJAX
3. JustUserR - 06 Декабря, 2010 - 00:35:39 - перейти к сообщению
Slavenin пишет:
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму
Возможность осуществления загрузки требуемого файла на целевой web-сервер без использования формы на пользовательской HTML-старницы - должна обеспечиваться посредством программного доступа к локальной файловой системе в JS-скрипте - и выполнению последующего считывания двоичного содержимого файла с его приведением в соответствующую 7bit-ную форму передачи в соответствии с параметров Content-tranfer-encoding Осуществление указанных действия в явном виде является возможным при использовании браузера Internet explorer и технологии ActiveX - которая позволяет осуществлять заданные программные действия в файловой системе - а также выполнять конвертирование объекта файла средствами компилированных загружаемых компонентов
4. Slavenin - 06 Декабря, 2010 - 11:59:10 - перейти к сообщению
ALEN пишет:
В любом случае формы + учите html + php и потом javascript - и уже на его основе AJAX

все это я знаю в необходимых пределах.

организовал загрузку через iframe, в ie все работает нормально, а opera отказывается загружать файл.
код формы:
PHP:
скопировать код в буфер обмена
  1. echo "
  2. <form id = \"formLoad\" action=\"test.php\" method=\"POST\" enctype=\"multipart/form-data\">
  3. <td align = \"center\">
  4. Фото:<br/>
  5. <input name=\"loadfile\" type=\"file\" size = \"10\">
  6. <input type=\"submit\" onClick = \"createIFrame()\" value=\"загрузить\">
  7. <input name=\"curId\" type=\"hidden\" value = \"photo_" .$i ."\">
  8. </form>
  9. </td>";

функции загрузки js
CODE (javascript):
скопировать код в буфер обмена
  1. function onResponse(d)
  2. {  
  3.  with(d)
  4.  {
  5.   eval('var obj = ' + d + ';');
  6.  }  
  7.   var obj2 = document.getElementById(obj.id);
  8.   var masFName = obj.filename;
  9.   obj2.innerHTML = masFName;
  10. }  
  11.  
  12. function createIFrame()
  13. {
  14.   var div = document.createElement('div');
  15.   div.getAttribute('id');
  16.   div.id = 'forFrame';
  17.   m = parseInt(1);
  18.   n = parseInt(10000);
  19.   var masNframe = Math.floor( Math.random() * (n - m + 1) ) + m;
  20.  
  21.   div.innerHTML = "<iframe id=\"rFrame\" name=\"" + masNframe + "\" style=\"display: none\"></iframe>";
  22.   document.body.appendChild(div);
  23.   document.getElementById('formLoad').getAttribute('target');
  24.   document.getElementById('formLoad').target = masNframe;
  25.  
  26. }


код на сервере:

PHP:
скопировать код в буфер обмена
  1. <?PHP  
  2.  function jsOnResponse($obj)  
  3.  {  
  4.  echo '
  5. <script type="text/javascript">
  6. window.parent.onResponse("'.$obj.'");
  7. </script>
  8. ';  
  9.  }  
  10.  $dir = 'img/';  
  11.  $name = basename($_FILES['loadfile']['name']);  
  12.  $file = $dir .$name;
  13.  if($success = move_uploaded_file($_FILES['loadfile']['tmp_name'], $file))
  14.  {  
  15.   echo "loaded";
  16.   jsOnResponse("{'filename':'" . $name . "', 'success':'" . $success . "', 'id':'" .$_POST['curId'] ."'}");
  17.  }
  18.  else
  19.  {
  20.   echo "notloaded";
  21.  }  
  22.  
  23. ?>  

(Добавление)
все победил, тег form был прописан до тега td, почему-то эксплорер это не смущало, а вот опера запротивилась, перенес его и все заработало
всем спасибо за помощь
5. Slavenin - 07 Декабря, 2010 - 19:34:46 - перейти к сообщению
возникла новая странность, есть скрипт которым гружу файлы на сервер:

PHP:
скопировать код в буфер обмена
  1. <?PHP  
  2.  header('Content-type: text/html; charset=utf-8');
  3.  
  4.  $dir = 'img/';  
  5.  $name = rus2translit(basename($_FILES['loadfile']['name']));
  6.    
  7.  $file = $dir .$name;
  8.  if($success = move_uploaded_file($_FILES['loadfile']['tmp_name'], $file))
  9.  {  
  10.   echo "loaded";
  11.  }
  12.  else
  13.  {
  14.   echo "notloaded";
  15.  }
  16.  
  17.  
  18. function rus2translit($string)
  19. {
  20.     $converter = array(
  21.         'а' => 'a',   'б' => 'b',   'в' => 'v',
  22.         'г' => 'g',   'д' => 'd',   'е' => 'e',
  23.         'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
  24.         'и' => 'i',   'й' => 'y',   'к' => 'k',
  25.         'л' => 'l',   'м' => 'm',   'н' => 'n',
  26.         'о' => 'o',   'п' => 'p',   'р' => 'r',
  27.         'с' => 's',   'т' => 't',   'у' => 'u',
  28.         'ф' => 'f',   'х' => 'h',   'ц' => 'c',
  29.         'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
  30.         'ь' => '',    'ы' => 'y',   'ъ' => '',
  31.         'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
  32.        
  33.         'А' => 'A',   'Б' => 'B',   'В' => 'V',
  34.         'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
  35.         'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
  36.         'И' => 'I',   'Й' => 'Y',   'К' => 'K',
  37.         'Л' => 'L',   'М' => 'M',   'Н' => 'N',
  38.         'О' => 'O',   'П' => 'P',   'Р' => 'R',
  39.         'С' => 'S',   'Т' => 'T',   'У' => 'U',
  40.         'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
  41.         'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
  42.         'Ь' => '',    'Ы' => 'Y',   'Ъ' => '',
  43.         'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
  44.     );
  45.     return strtr($string, $converter);
  46. }  
  47.  
  48. ?>


после загрузки файла с русским именем тест.jpg вижу вместо test.jpg который показывал денвер при тестировании, 1.jpg в чем проблема понять не могу...
6. JustUserR - 07 Декабря, 2010 - 20:39:47 - перейти к сообщению
Slavenin пишет:
Организовал загрузку через iframe, в ie все работает нормально, а opera отказывается загружать файл.код формы:
Приведенная вами реализация пользовательского приложения обеспечивает включение в явном виде оригинального бразерного компонента формы посредством его генерации в DOM-модели документа - такой вариант в действительности является оптимальным - однако в качестве его модификации возможно применние предшествующей опережающей обработки контроля загрузки компонента - с целью предотвращения выполнения активной программы в контейнерном элементе которая может оказывывать действенное влияние на текущую HTML-страницу
7. Slavenin - 07 Декабря, 2010 - 21:21:44 - перейти к сообщению
уважаемый, JustUserR, различные варианты контроля ограничения типов файлов и прочие элементы безопасности я еще не писал, да и реализовывать большую часть из них буду на стороне сервера, так как там возможности их контроля со стороны конечного пользователя крайне ограничены.

Не подскажете почему файл так криво загружается? точнее почему он так загружается я понимаю, проблема в том что сервер не может распознать кодировку имени файла на своей стороне, именно поэтому я включил в код функцию для транслитерации, но так как файл сначала загружается во временную папку на стороне сервера, то его нераспознанное имя меняется с набора кракозябр на цифру 1, вопрос, как моэно избежать подобной ситуации. Я так понимаю, что необходимо послать вместе с формой соответствующий заголовок,
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset=utf-8');
но как это реализовать не знаю, в коде исходной страницы присутсвует тег
CODE (html):
скопировать код в буфер обмена
  1. <meta http-equiv=\"content-type\" content=\"text/html; utf-8\">
логика подсказывает что имя должно расшифровываться правильно, но этого не происходит. скорее всего потому что форма отправляется через iframe, есть ли возможность отослать заголовок из iframe?
8. Slavenin - 08 Декабря, 2010 - 11:20:31 - перейти к сообщению
доработал функцию создания фрейма, теперь он должен отсылать нормальный заголовок

CODE (javascript):
скопировать код в буфер обмена
  1. function createIFrame(idForm)
  2. {
  3.   var IdPhoto = idForm.split("_");
  4.   m = parseInt(1);
  5.   n = parseInt(10000);
  6.   var masNframe = Math.floor( Math.random() * (n - m + 1) ) + m;
  7.   document.getElementById('photo_'+IdPhoto[1]).innerHTML = "<font color = \"red\"><b>Производится загрузка</b></font>";
  8.   var div = mas_CreateElem('div', (masNframe + '_'), '');
  9.   div.innerHTML = "<iframe id=\"" +masNframe + "_\" name=\"" + masNframe + "\" style=\"display: none\"></iframe>";
  10.   document.getElementById(idForm).getAttribute('target');
  11.   document.getElementById(idForm).target = masNframe;
  12. /////////////////    
  13.   var Iobj = document.getElementsByName(masNframe)[0];  
  14.   var Idiv = document.createElement('div');
  15.   Idiv.getAttribute('id');
  16.   Idiv.id = (masNframe + '_D');
  17.   Iobj.appendChild(Idiv);
  18.   Idiv.innerHTML = "<?php header(\'Content-type: text/html; charset=utf-8\');?>";
  19. }


опера dragonfly в добавленном диве выводит следующий текст: <?php header('content-type:=undefined text/html;=undefined charset=utf-8');?> может я неправильно заголовок передаю?

но имя файла по прежнему раскодируется неверно Огорчение
9. Мелкий - 08 Декабря, 2010 - 11:39:21 - перейти к сообщению
Заголовок должен посылать сервер. На клиенте PHP не исполняется
10. Slavenin - 08 Декабря, 2010 - 13:08:20 - перейти к сообщению
ясно, чето я совсем уже записался... Радость кто-нибудь подскажите как файл с русским именем загрузить на сервак? Хм

 

Powered by ExBB FM 1.0 RC1