Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

HTTPS и POST метод   Найти похожие ветки 

 
Alex_C   (2007-10-24 14:01) [0]

Подскажите пожайлуста: есть страничка
https://www.arrl.org/lotw/upload
зайти туда может любой и загрузить свой фаил.
Как это сделать, кратко описано тут:
http://www.arrl.org/lotw/developer/uploads.html
Делал такой запрос:

const
   multipart_boundary = "-----------------------------7cf87224d2020a";
...

   PostStr := TStringList.Create;

   // Создание header
   PostStr.Add( "Content-type: multipart/form-data, boundary=" + multipart_boundary );
   PostStr.Add( "Content-length: " + FileSize(F) + Length("--" + multipart_boundary + "--")+2 );
   PostStr.Add( "" );

   // Заголовок
   PostStr.Add( "--"+ multipart_boundary );
   PostStr.Add( "Content-Disposition: form-data; name="upfile"; filename=""+
                CurrDir + "\Log\UploadToLoTW.tq8"");
   PostStr.Add( "Content-type: application/octet-stream" );
   PostStr.Add( "" );

   // Считываем фаил в файловый поток и копируем его в строковый поток
   fstream := TFileStream.Create( CurrDir + "\Log\UploadToLoTW.tq8", fmOpenRead+fmShareDenyNone );
   sstream := TStringStream.Create("");
   sstream.CopyFrom(fstream, 0);
   fstream.Free;
   PostStr.Add(sstream.DataString);
   sstream.Free;

   // Добавляем окончание
   PostStr.Add( "" );
   PostStr.Add( "--" + multipart_boundary + "--" );

Вроде все как надо делаю, но не получается. Может кто подскажет?


 
Reindeer Moss Eater ©   (2007-10-24 14:09) [1]

а зачем такие извраты, если у тебя семерка?


 
umbra ©   (2007-10-24 14:52) [2]

а как сам запрос делается то?


 
Alex_C ©   (2007-10-24 18:35) [3]

Гм. Это не извраты. Просто не хочу по опрелеленным причинам использовать дополнительные компоненты.
Сам запрос осуществляется так:
(я это нашел в инете и модифицировал для использования с https. Все с https работает - пробовал заполнять формы, а вот именно фаил загрузить не могу.)

function HTTPGet(URL, RequestMethod, PostQuery: String; ProgressProc: TProgresProc): String;
var
 hSession, hConnect, hRequest: hInternet;
 HostName, FileName: String;
 dwBufLen, dwIndex: DWord;
 Data: Array[0..$400] of Char;
 BytesToRead, BytesReaded: DWord;
 TempStr: String;
 Buf: Pointer;
 AcceptType: String;
 IP: String;
 HTTP_Port: DWord;
 dwFlags, dwError: DWord;
 SendReqestResult: Boolean;

   procedure CloseHandles;
   begin
       InternetCloseHandle(hRequest);
       InternetCloseHandle(hConnect);
       InternetCloseHandle(hSession);
   end;

begin
   Result := "";

   // Проверяем соединение
   IP := LocalIP;
   if (IP = "") or (IP = "127.0.0.1") then
       Exit;

   ParseURL(URL, HostName, FileName);

   if Pos("https://", URL) <> 0 then
       HTTP_Port := INTERNET_DEFAULT_HTTPS_PORT
   else
       HTTP_Port := INTERNET_DEFAULT_HTTP_PORT;

   hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
   hConnect := InternetConnect (hSession, PChar(HostName),
                         HTTP_Port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
   AcceptType := PChar("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*");

   if HTTP_Port = INTERNET_DEFAULT_HTTPS_PORT then
     dwFlags := INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
   else
     dwFlags := 0;

   dwFlags := dwFlags or INTERNET_FLAG_RELOAD;

   hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod), PChar(FileName), HTTP_VERSION,
               nil, @AcceptType, dwFlags, 0);

   if RequestMethod = "GET" then
       SendReqestResult := HttpSendRequest(hRequest, nil, 0, nil, 0)
   else
       SendReqestResult := HttpSendRequest(hRequest, "Content-Type: application/x-www-form-urlencoded", 47,
                    PChar(PostQuery), Length(PostQuery));

   if not SendReqestResult then
   begin
       dwError := GetLastError;
       ShowMessage( "Error connect: " + IntToStr(dwError) );
   end;

   dwIndex  := 0;
   dwBufLen := 1024;
   GetMem(Buf, dwBufLen);

   HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, Buf, dwBufLen, dwIndex);

   BytesReaded := 0;
   BytesToRead := 0;

   try
       while True do
       begin
           if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then
               Break
           else
               if BytesToRead = 0 then
                   Break
               else
               begin
                   TempStr := Data;
                   SetLength(TempStr, BytesToRead);
                   Result := Result + TempStr;
                   inc(BytesReaded, BytesToRead);
                   if Assigned(ProgressProc) then
                       ProgressProc(BytesReaded);
               end;
       end;
   finally
       FreeMem(Buf);
       CloseHandles;
   end;
end;

Выкинул чтоб не загламлять незначачие ф-ции. Основное - вот.


 
MetalFan ©   (2007-10-30 13:32) [4]

и хоть бы одна проверка результата, возвращаемого функциями...
да, одна есть)



Страницы: 1 вся ветка

Текущий архив: 2008.09.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
15-1218131612
Nic
2008-08-07 21:53
2008.09.28
Накрылся вентилятор блока питания ПК


15-1218031848
alien1769
2008-08-06 18:10
2008.09.28
ЗАДАЧА ЭЙНШТЕЙНА


15-1218050298
Franciscosuarez
2008-08-06 23:18
2008.09.28
Photoshop Уважаемые форумчане, подскажите, пожалуйста


2-1219159527
snake-as
2008-08-19 19:25
2008.09.28
TWeb-Browser и работа в интернет


2-1218705471
kate158
2008-08-14 13:17
2008.09.28
открыть файл с помощью ShellExecute, путь к ктр лежит в реестре