Конференция "Сети" » Индикатор (progress) отправки файла через WinInet... [D7, WinXP]
 
  • WStealth (28.11.07 19:34) [0]
    Может кто нибудь подскажет возможно ли это???
    И если да то подскажите как.

    Отправка данных идет примерно так:
    hInternet := InternetOpen(PChar(FClientName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
     If hInternet <> nil then begin
       hConnect := InternetConnect(hInternet,PChar(FSiteHost),INTERNET_DEFAULT_HTTP_PORT,'anonymous ',nil,INTERNET_SERVICE_HTTP,0,0);
       If hConnect <> nil then begin
         hRequest := HTTPopenRequest(hConnect,PChar('POST'),PChar(FScriptURL),nil,nil,nil,INTERNET_FL AG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);
         If hRequest <> nil then begin
           If FParameters <> '' then begin
             Header := 'Content-Type: application/x-www-form-urlencoded';
             MyResult := HTTPsendRequest(hRequest,PChar(Header),Length(Header),PChar(FParameters),Length( FParameters));
           end else MyResult := HTTPsendRequest(hRequest,nil,0,nil,0);
    . . .


    Проблема в том, что данные отправляются методом POST и могут быть большого размера (до 40 МБ)...

    И ясно дело хотелось бы что бы пользователь был проинформирован о количестве отправленных данных (даже банальным progressbar'ом)...
  • Сергей М. © (29.11.07 08:47) [1]
    Без доп.выкрутасов, пожалуй, никак.
    Если нет возможности отказаться от wininet-функций в пользу иных средств (предоставляющих такого рода контроль), то можно посоветовать реализовать в программе простейший локальный прокси с функцией портмаппера, через который прогонять весь свой wininet-траффик и который позволит контролировать потоки передаваемых/принимаемых данных.
  • Сергей М. © (29.11.07 08:55) [2]
    Хотя вру, причем нагло)

    Есть в wininet такой механизм. См. InternetSetStatusCallback()
  • WStealth (29.11.07 12:40) [3]
    К сожалению чой-то не получается... или я чего то не пойму...

    делю так:



    procedure Callback(hInet: HINTERNET; dwContext: DWORD; dwInternetStatus: DWORD; lpvStatusInformation: Pointer; dwStatusInformationLength: DWORD); stdcall;
    var
     St : String;
    begin
     St := '1';  //для того что бы breakpoint поставить
    end;

    . . .

    hInternet := InternetOpen(PChar(FClientName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
     If hInternet <> nil then begin
       InternetSetStatusCallback(hInternet, INTERNET_STATUS_CALLBACK(@Callback));
       hConnect := InternetConnect(hInternet,PChar(FSiteHost),INTERNET_DEFAULT_HTTP_PORT,'anonymous ',nil,INTERNET_SERVICE_HTTP,0,0);
       If hConnect <> nil then begin
         hRequest := HTTPopenRequest(hConnect,PChar('POST'),PChar(FScriptURL),nil,nil,nil,INTERNET_FL AG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);
         If hRequest <> nil then begin
    (@Callback));
           If FParameters <> '' then begin
             Header := 'Content-Type: application/x-www-form-urlencoded';
             MyResult := HTTPsendRequest(hRequest,PChar(Header),Length(Header),PChar(FParameters),Length( FParameters));
           end else MyResult := HTTPsendRequest(hRequest,nil,0,nil,0);
    . . .



    И по debug'у не зажодит в функцию Callback никогда...

    Может кто чего нить подскажет???
  • Сергей М. © (29.11.07 12:43) [4]
    Ты справку к упомянутой функции внимательно читал ?

    Там ведь четко описаны условия для работы функции (см. параметры вызова InternetOpen)

    Ты эти условия не соблюдаешь, вот оно и не полачается)
  • Anatoly Podgoretsky © (29.11.07 12:54) [5]
    > Сергей М.  (29.11.2007 12:43:04)  [4]

    Кроме того значение в функции не используется, оптимизатор выкинет.
  • WStealth (29.11.07 13:15) [6]
    Такс... с этим вроде разобрались!!!
    Функция вызывается... (оказывается при вызове нужно было dwContex ставить не нулевой!!!)

    Вот теперь вопрос по существу...

    Мне нужно получать кол-во отправленных на сервер байт.
    По описанию функции мне подходят вот какие статусы:

    INTERNET_STATUS_REQUEST_COMPLETE (это когда закончилась отправка)
    INTERNET_STATUS_REQUEST_SENT (это когда полностью отправлен запрос и в lpvStatusInformation ссылка на DWORD содержащий кол-во отправленных байт)
    INTERNET_STATUS_SENDING_REQUEST (это во время отправки... но lpvStatusInformation = NULL ????? )

    И вот собственно говоря и вопрос... так как и при каком статусе мне получить кол-во отправленных байт на текущий момент вызова функции Callback???
  • Сергей М. © (29.11.07 13:20) [7]
    Фиг его знает ..

    Я не пользовал эту фичу, ничего сказать по этому поводу не могу.

    Гугли по теме INTERNET_STATUS_SENDING_REQUEST, думаю, найдешь то что ищешь.
  • Anatoly Podgoretsky © (29.11.07 13:23) [8]
    > WStealth  (29.11.2007 13:15:06)  [6]

    А в каком тебе нужно, все три правильные.
  • WStealth (29.11.07 13:27) [9]
    То что правильные - это точно!!!

    Только вот мне нужно во время отправки писать кол-во отправленных байт (или же progressBar), т.е. статусы INTERNET_STATUS_REQUEST_COMPLETE и  INTERNET_STATUS_REQUEST_SENT - мне не подходят, т.к. в INTERNET_STATUS_REQUEST_COMPLETE вообще данных никаких нет (статус сигнализирует об окончании отправки запроса), а в INTERNET_STATUS_REQUEST_SENT данные есть, но они - это размер всего отправленного пакета.

    А в INTERNET_STATUS_SENDING_REQUEST нет никаких данных о размере переданных данных.
  • Anatoly Podgoretsky © (29.11.07 13:32) [10]
    > WStealth  (29.11.2007 13:27:09)  [9]

    Если отправленых, но еще не закончено, то это прошедшие время, это в переводе на английский получается SEND.
    И расшифруй что ты имеешь в виду под </>размер всего отправленного пакета.
  • WStealth (29.11.07 13:46) [11]
    неа... INTERNET_STATUS_REQUEST_SENT возвращает полный размер всего отправленного пакета...

    В общем ничего не получается...

    Буду наверное через Indy отправлять... :о(
  • Сергей М. © (29.11.07 13:50) [12]

    > Буду наверное через Indy отправлять


    Шило на мыло менять ?)

    Проще и надежней сочинить локальный прокси-портмэппер (на базе, скажем, проверенных временем TTCPClient/Server или TClient/ServerSocket), как я тебе и советовал вначале.
  • Anatoly Podgoretsky © (29.11.07 14:26) [13]
    > WStealth  (29.11.2007 13:46:11)  [11]

    А может стоит освоить WinInet, Инди освоить сложнее.
  • MetalFan © (17.12.07 15:20) [14]
    вопрос решен? автор изначально неправильно подошел к отправке.
    если интересно - могу разъяснить
  • DiamondShark © (17.12.07 16:20) [15]

    > если интересно - могу разъяснить

    Интересно. Разъясни.
    Всё-таки, форум читают не только авторы.
  • MetalFan © (17.12.07 18:37) [16]
    для контроля за отправкой (например при отправке больших файлов)
    необходимо воспользоваться связкой HTTPSendRequestEx + InternetWriteFile + HTTPEndRequest.
    пример отправки может быть найден в MSDN.
    так же отправка больших запросов с пом. WinInet реализована в моем компоненте, о котором можно прочитать и скачать здесь http://forum.vingrad.ru/forum/topic-186678/kw-wininet-tmfwihttp-http-client.html
  • имя (25.12.08 13:18) [17]
    Удалено модератором
  • имя (25.12.08 13:19) [18]
    Удалено модератором
  • 2 (31.01.10 03:20) [19]
    2
  • имя (29.12.10 12:32) [20]
    Удалено модератором
 
Конференция "Сети" » Индикатор (progress) отправки файла через WinInet... [D7, WinXP]
Есть новые Нет новых   [134436   +25][b:0][p:0.002]