Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Получить файл пользователя, указанный в html форме


Автор: VIRTuoZe 6.8.2008, 14:44
Всех приветствую 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

Заранее спасибо.

Автор: Snowy 6.8.2008, 17:28
В комплекте Indy нет средств для парсинга мультипарт запросов.
Для составления есть. А для разбора - нет.
Так что воспользуйся каким-нибудь сторонним мультипарт парсером.
Например этим: 
http://www.torry.net/vcl/internet/http/Alcinoe_cmp_3_52_28.zip    FWS    8545 k    11 Feb 2008
By Arkadia. MultiPart Alternative objects to encode or Decode stream in mime multipart/Alternative format.

Добавлено через 6 минут и 48 секунд
Файлик достаточно пухлый, т.к. там весьма приличная библиотека всякой всячины с примерами.
Тебе оттуда нужен только парсер.
Хотя там много и других полезностей для работы с хттп и прочим.

Автор: VIRTuoZe 7.8.2008, 07:57
Snowy, ок, спасибо, сейчас попробую smile

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

Попробую - отпишусь о результате)

Автор: VIRTuoZe 7.8.2008, 12:22
К сожалению этот компонент существует только в вариантах для D2005 D2006 D2007 D7, а у меня стоит D6 и поменять нет возможности...
Пойду искать другие компоненты... или придется все через PHP проводить, у него прием файлов прекрасно работает))

Автор: Snowy 7.8.2008, 12:44
Это не компонент, а библиотечка.
Причём в исходняках.
Не вижу, что может помешать ей работать в 6-ке.
В крайнем случае, можно просто посмотреть, как там сделано.
В любом случае разбирать нужно текст.
Нарезаешь куски по бинду и анализируешь.
Если форма твоя, то даже анализировать необязательно - всё определено заранее.
Остаётся только разделить на части и декодировать.

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

Если я правильно понял, то нужно просто подключить в 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


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

Метод "научного тыка" в этот раз подвел... так и не нашел ничего...

Автор: VIRTuoZe 13.8.2008, 11:21
ААА!)))
Получилось  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, еще раз спасибо))

*ушел парсить полученные данные...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)