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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Slavenin
Отправлено: 05 Декабря, 2010 - 20:00:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




Доброго времени суток всем!
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму. Пользователь вводит множество данных, в том числе выбирает путь к картинке которая должна быть загружена. Жмет кнопку, далее я джавой опрашиваю нужные поля форм и шлю все это ajax на сервер. Облазив интернет нашел технология с iframe, но динамическая загрузка файла мне не нужна, к тому же в каждой строке с данными может быть свой файл. Так вот, как осуществить загрузку этих файлов на сервак. В статье http://xmlhttprequest[dot]ru/#encoding есть интересная строчка:
Цитата:
Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.
так вот подскажите как можно самостоятельно сформировать тело запроса? логика подсказывает что это можно сделать аналогично вложению в письмо, но для этого надо чтобы был доступ к файлу.
 
 Top
ALEN
Отправлено: 05 Декабря, 2010 - 23:13:56
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Slavenin
В любом случае формы + учите html + php и потом javascript - и уже на его основе AJAX
 
 Top
JustUserR
Отправлено: 06 Декабря, 2010 - 00:35:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Slavenin пишет:
Есть такая необходимость загрузить на сервер файл, но проблема в том что делать это надо не через форму
Возможность осуществления загрузки требуемого файла на целевой web-сервер без использования формы на пользовательской HTML-старницы - должна обеспечиваться посредством программного доступа к локальной файловой системе в JS-скрипте - и выполнению последующего считывания двоичного содержимого файла с его приведением в соответствующую 7bit-ную форму передачи в соответствии с параметров Content-tranfer-encoding Осуществление указанных действия в явном виде является возможным при использовании браузера Internet explorer и технологии ActiveX - которая позволяет осуществлять заданные программные действия в файловой системе - а также выполнять конвертирование объекта файла средствами компилированных загружаемых компонентов


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Slavenin
Отправлено: 06 Декабря, 2010 - 11:59:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




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, почему-то эксплорер это не смущало, а вот опера запротивилась, перенес его и все заработало
всем спасибо за помощь
 
 Top
Slavenin
Отправлено: 07 Декабря, 2010 - 19:34:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




возникла новая странность, есть скрипт которым гружу файлы на сервер:

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 в чем проблема понять не могу...
 
 Top
JustUserR
Отправлено: 07 Декабря, 2010 - 20:39:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Slavenin пишет:
Организовал загрузку через iframe, в ie все работает нормально, а opera отказывается загружать файл.код формы:
Приведенная вами реализация пользовательского приложения обеспечивает включение в явном виде оригинального бразерного компонента формы посредством его генерации в DOM-модели документа - такой вариант в действительности является оптимальным - однако в качестве его модификации возможно применние предшествующей опережающей обработки контроля загрузки компонента - с целью предотвращения выполнения активной программы в контейнерном элементе которая может оказывывать действенное влияние на текущую HTML-страницу


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Slavenin
Отправлено: 07 Декабря, 2010 - 21:21:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




уважаемый, 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?
 
 Top
Slavenin
Отправлено: 08 Декабря, 2010 - 11:20:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




доработал функцию создания фрейма, теперь он должен отсылать нормальный заголовок

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');?> может я неправильно заголовок передаю?

но имя файла по прежнему раскодируется неверно Огорчение
 
 Top
Мелкий Супермодератор
Отправлено: 08 Декабря, 2010 - 11:39:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Заголовок должен посылать сервер. На клиенте PHP не исполняется


-----
PostgreSQL DBA
 
 Top
Slavenin
Отправлено: 08 Декабря, 2010 - 13:08:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




ясно, чето я совсем уже записался... Радость кто-нибудь подскажите как файл с русским именем загрузить на сервак? Хм
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB