Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить файл пользователя, указанный в html форме 
:(
    Опции темы
VIRTuoZe
Дата 6.8.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 27.7.2004
Где: Новокуйбышевск (С амарская обл.)

Репутация: нет
Всего: нет



Всех приветствую smile
Возникла небольшая проблема, с которой никак не могу разобраться... скорее всего все элементарно, просто никак не пойму)

Есть web-сервер, написанный на delphi с использованием Indy (TidHTTPServer).
Когда пользователь запрашивает страницу загрузки файла (через браузер), сервер генерит страницу с такой формой:

Код

<form enctype="multipart/form-data" name="settingsForm" action="/action?" metod=POST>
  <input type=hidden name=action value='PostUserSettings'>
  <input type=hidden name=mode value='report'>
  ...
  <input type="file" name="fileupload1"  onchange =""  style="width:200">
  ...
  <input name="Button" type="submit" onClick="" value="Загрузить" style="width:80">
  ...
</form>


Так вот... после отправки данных, я смог только прочитать путь к файлу из параметра fileupload1, а как получить содержимое этого файла?

Есть функция:

Код

function DoPostUserSettings(var paramsParser : TMZParamsParser;
                           var ResponseInfo : TidHTTPResponseInfo;
                           sessionID : string;
                           fromIP : string; RequestInfo: TIdHTTPRequestInfo) : boolean;

которая при наличии параметров "PostUserSettings" и "report" вызывается из:

Код

procedure TAppForm.HTTPServerCommandGet(AThread: TIdPeerThread;
  RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);


Хоть подскажите в какую сторону копать, откуда вытаскивать содержимое файла?... просто я ни разу с этим не сталкивался smile

Заранее спасибо.
PM MAIL WWW ICQ   Вверх
Snowy
Дата 6.8.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



В комплекте Indy нет средств для парсинга мультипарт запросов.
Для составления есть. А для разбора - нет.
Так что воспользуйся каким-нибудь сторонним мультипарт парсером.
Например этим: 
ALMultiPartAlternativeParser v.3.50    FWS    8545 k    11 Feb 2008
By Arkadia. MultiPart Alternative objects to encode or Decode stream in mime multipart/Alternative format.

Добавлено через 6 минут и 48 секунд
Файлик достаточно пухлый, т.к. там весьма приличная библиотека всякой всячины с примерами.
Тебе оттуда нужен только парсер.
Хотя там много и других полезностей для работы с хттп и прочим.
PM MAIL   Вверх
VIRTuoZe
Дата 7.8.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 27.7.2004
Где: Новокуйбышевск (С амарская обл.)

Репутация: нет
Всего: нет



Snowy, ок, спасибо, сейчас попробую smile

Очень жаль, что стандартными средствами нельзя сделать... не хотелось бы дополнительные компоненты использовать...

Попробую - отпишусь о результате)
PM MAIL WWW ICQ   Вверх
VIRTuoZe
Дата 7.8.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 27.7.2004
Где: Новокуйбышевск (С амарская обл.)

Репутация: нет
Всего: нет



К сожалению этот компонент существует только в вариантах для D2005 D2006 D2007 D7, а у меня стоит D6 и поменять нет возможности...
Пойду искать другие компоненты... или придется все через PHP проводить, у него прием файлов прекрасно работает))
PM MAIL WWW ICQ   Вверх
Snowy
Дата 7.8.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Это не компонент, а библиотечка.
Причём в исходняках.
Не вижу, что может помешать ей работать в 6-ке.
В крайнем случае, можно просто посмотреть, как там сделано.
В любом случае разбирать нужно текст.
Нарезаешь куски по бинду и анализируешь.
Если форма твоя, то даже анализировать необязательно - всё определено заранее.
Остаётся только разделить на части и декодировать.
PM MAIL   Вверх
VIRTuoZe
Дата 12.8.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 27.7.2004
Где: Новокуйбышевск (С амарская обл.)

Репутация: нет
Всего: нет



С библиотекой парсера почти разобрался, просто немного недопонял в начале)
Возник другой вопрос, с которым уже второй день бьюсь...

Если я правильно понял, то нужно просто подключить в uses "ALMultiPartBaseParser", в процедуре обработки запроса объявить переменную типа "TALMultiPartBaseContent", и сделать что-то типа:

Код

...
var test : TALMultiPartBaseContent;
...
      test := TALMultiPartBaseContent.Create;
      test.LoadDataFromStream(RequestInfo.PostStream);
...


при первом же запросе (просто загрузить форму для отправки файла) вылетает "Access violation at address ...".
Я смотрю содержимое RequestInfo.PostStream - оно "=nil", ну ладно, ставлю условие "if RequestInfo.PostStream <> nil then begin", так оказывается оно всегда = nil, т.е., если я правильно понял - пусто.

Так вот в этом-то и вопрос - а как получить в виде текста содержимое мультипарт-запроса?
Т.е., например, в таком виде:
Код

7d015813802c4
Content-Disposition: form-data; name="checkbox"
ON
7d015813802c4
Content-Disposition: form-data; name="radiobox"
ON
7d015813802c4
Content-Disposition: form-data; name="text"
...текст из элемента текст...
7d015813802c4
Content-Disposition: form-data; name="myfile1"; filename="C:image.gif"Content-Type: image/gif
...содержимое файла 1...
7d015813802c4
Content-Disposition: form-data; name="myfile2"; filename="C:test.exe"Content-Type: application/octet-stream
...содержимое файла 2...
7d015813802c4
Content-Disposition: form-data; name="myfile3"; filename="C:text.txt"Content-Type: text/plain
...содержимое файла 3...
7d015813802c4


Я бы его и сам распарсил как надо, это не проблема)))

Метод "научного тыка" в этот раз подвел... так и не нашел ничего...
PM MAIL WWW ICQ   Вверх
VIRTuoZe
Дата 13.8.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 27.7.2004
Где: Новокуйбышевск (С амарская обл.)

Репутация: нет
Всего: нет



ААА!)))
Получилось  smile 

Прочитал я, наконец-то, то что мне надо было)))
Код

-----------------------------7d8385218c077c
Content-Disposition: form-data; name="action"

PostUserSettings
-----------------------------7d8385218c077c
Content-Disposition: form-data; name="mode"

report
-----------------------------7d8385218c077c
Content-Disposition: form-data; name="fileupload1"; filename="C:\test.doc"
Content-Type: application/msword

ÐÏࡱá
...


 smile 

А все оказалось банально и просто)))
При описании HTML формы у меня всего одна маленькая опечатка:
Код

<form enctype="multipart/form-data" name="settingsForm" action="/action?" metod=POST>


"metod=POST", а надо "method=POST". Поправил и сразу увидел то, что мне надо, в параметре RequestInfo.UnparsedParams))))


Snowy, еще раз спасибо))

*ушел парсить полученные данные...
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.