Upload и PHP
Есть корпоративный портал. У каждого отдела там есть своя папка. В эту папку можно загружать файлы (приказы и т.п.). Однако возможности портала не позволяют загружать один файл в несколько папок сразу, а бывают документы, которые должны быть разосланы скажем сразу в 20 отделов. Понятно, что по одному загружать невесело.. Хотелось бы сделать, чтобы выбрал файл, пометил галочками отделы, куда загружать и один(!) раз нажать кнопку "Разослать". Загрузка осуществляется через серверный upload-скрипт (менять его я не могу) методом POST. И он загружает только в одно местоположение, т.е. для загрузки в несколько папок его надо вызвать несколько раз! В этом и проблема... Как послать несколько POST запросов с <INPUT type=file> средствами HTML и PHP, не выбирая каждый раз файл заново? Хотел соединяться с порталом и формировать POST запросы "вручную" средствами PHP, но ситуация осложняется тем, что портал требует NTLM аутентификации - в общем очень сложно получается...
Может кто подскажет как сделать проще?
Надеюсь объяснил понятно - заранее спасибо!
Объясняю ситуацию:
Есть корпоративный портал. У каждого отдела там есть своя папка. В эту папку можно загружать файлы (приказы и т.п.). Однако возможности портала не позволяют загружать один файл в несколько папок сразу, а бывают документы, которые должны быть разосланы скажем сразу в 20 отделов. Понятно, что по одному загружать невесело.. Хотелось бы сделать, чтобы выбрал файл, пометил галочками отделы, куда загружать и один(!) раз нажать кнопку "Разослать". Загрузка осуществляется через серверный upload-скрипт (менять его я не могу) методом POST. И он загружает только в одно местоположение, т.е. для загрузки в несколько папок его надо вызвать несколько раз! В этом и проблема... Как послать несколько POST запросов с <INPUT type=file> средствами HTML и PHP, не выбирая каждый раз файл заново? Хотел соединяться с порталом и формировать POST запросы "вручную" средствами PHP, но ситуация осложняется тем, что портал требует NTLM аутентификации - в общем очень сложно получается...
Может кто подскажет как сделать проще?
Надеюсь объяснил понятно - заранее спасибо!
Можно сделать так: если передаються параметры нескольких папок то вызываеться функция copy() раскидывающий загруженный файл по остальным папкам.
Можно сделать так: если передаються параметры нескольких папок то вызываеться функция copy() раскидывающий загруженный файл по остальным папкам.
К сожалению как я уже написал - я не имею возможности менять серверный upload-скрипт. А если быть еще точнее - то и папки на сервере виртуальные (работа с ними идет через MS SQL). В качестве параметра upload-скрипту я могу передать только одну папку, поэтому и возникает необходимость вызывать его несколько раз для каждой папки.
Еще идеи?
http://detail.phpclub.ru/article/http_request
Интересная у вас система стоит... а почему ты доступ не имеешь если не секрет ? )
ключ к решению:
http://detail.phpclub.ru/article/http_request
Интересная у вас система стоит... а почему ты доступ не имеешь если не секрет ? )
Эту статью я видел. И, как я уже писал, собирался формировать multipart POST запросы "вручную" через PHP, но столкнулся с новой проблемой - NTLM аутентификация на сервере. По этому вопросу инфу еще не искал (если кто даст ссылочку буду благодарен), решил вас спросить - может есть решение попроще. Было бы идеально использовать <INPUT type=file> для POST запроса (броузер сам обрабатывает аутентификацию), но к сожалению свойство value у <INPUT type=file> только для чтения, а action посылает только 1 POST запрос, и я не вижу способа сделать несколько обращений к этому злополучному upload-скрипту.
Надо было сразу описать систему подробнее, чтобы не возникало вопросов. Портал стоит на MS SharePoint Services. Доступ я в принципе к нему имею, но там все еще сложнее: скрипты на ASP.NET (я в нем ноль), работа через MS SQL, половина скриптов формируются динамически в этих самых виртуальных папках - в общем я решил использовать старый добрый PHP :)
откудого взялась NTLM аутентификация на сервере (?) я тебе дал эту статью чтобы ты составил несколько запросов.. когда ты отправляешь через форму загрузить фаил.. тыиспытываешь проблемы с NTLM аутентификация на сервере .. так в чем тогда беда когда делаешь запрос ручками ?
OK! Опишу подробнее...
Доступ на портал ограничен. Аутентификация идет через домен.
Когда используешь броузер для загрузки файлов, то при обращении к upload-скрипту броузер автоматически обрабатывает запрос на аутентификацию (401 Unauthorized) и выдает стандартное окошко (логин, пароль, домен). Если аутентификация пройдена успешно, то скрипт работает дальше (загружает файл).
Если посылать POST запрос средствами PHP, то сервер отвечает:
401 Unauthorized
Authentication: NTLM
В общем требуется на PHP в этом случае реализовывать NTLM аутентификацию (естественно в рамках HTTP запросов), не хотелось бы конечно лезть в это дело, но пока я не вижу других способов.
если в форме это можно чтобы заработала.. значит и скрипт можно.. нет различий..
помоему ты просто ленишься, чуть задуматься..
в какой момент происходит авторизация ?
если в форме это можно чтобы заработала.. значит и скрипт можно.. нет различий..
помоему ты просто ленишься, чуть задуматься..
Насколько я знаю HTTP протокол, то дело происходит так:
1) Броузер
Когда пользователь нажимает submit на форме, то броузер формирует POST запрос к upload-скрипту (который естественно прописан в <form action=). Сервер отвечает:
401 Unauthorized
Authentication: NTLM
Броузер получив такой ответ, САМ выдает пользователю окошко "пароль-логин" (такая ситуация программируется в броузере) и после того, как пользователь их ввел, формирует новый запрос к скрипту, используя поле WWW-Authenticate (этот примерно - подробно еще не разбирался). Скрипт получает данные аутентификации и выполняется дальше. Аутентификация выполняется скорее всего скриптом (проверка куков), но я не вижу разницы если она будет выполняться на уровне сервера(IIS 6.0).
Вывод: процедуру аутентификации отрабатывает САМ БРОУЗЕР (в нем это запрограммировано)
2) PHP
Я, используя socket функции PHP, соединяюсь с 80 портом сервера, формирую POST запрос и посылаю скрипту. Ответ, как и в случае с броузером, естесственно:
401 Unauthorized
Authentication: NTLM
Теперь мне надо послать другой запрос с параметрами аутентификации, который я не знаю как формируется (в броузере-то порядок NTLM аутентификации запрограмирован, а тут...). Я пробовал "подсмотреть", что посылает броузер в этом случае. Буду разбираться, но там все протекает в несколько этапов(запросов) с использованием base64.
Joker, может я не понимаю, что ты имеешь ввиду?
Но что мне посылать скрипту в ответ на 401 Unauthorized?
http://detail.phpclub.ru/article/page_password1
Joker, я же не пишу скрипт авторизации, я пытаюсь её пройти :). К тому же в статье нет ни слова про NTLM авторизацию.
Ну да ладно.. :) Вот нашел RFC по NTLM авторизации (в том числе HTTP NTLM авторизации):
http://curl.haxx.se/rfc/ntlm.html
Осталось реализовать все это на PHP :(, а так не хотелось с этим связываться!
Неужели нет более простого способа реализовать последовательную посылку нескольких POST запросов к upload-скрипту?!