Форум » [x]Harbour » HBCURL » Ответить

HBCURL

Eduard: Dima пишет: [quote]Вот и все непонятки закончились после того как убил кучу времени. У DownloadFile проблема с длинными именами файлов , при чем в UploadFile этой проблемы нет. Не важно каков размер файла , важна для него длина имени файла. Прошу опровергнуть или подтвердить описанное поведение DownloadFile. [/quote] Добрый день. У меня точно такая же проблема нарисовалась в моей программе, как описывает Дима. Программа на отрез не хочет принимать с фтп длинные имена файлов. точь в точь как в этой теме http://clipper.borda.ru/?1-4-0-00000844-000-10001-0 Удалось ли Вам побороть данную проблему.? Как вышли из ситуации? Хочу перейти на HBCURL, но нужно описание всех функций, особенно получение списка файлов с фтп-сервера по маске и скачивание файлов с сервера. Поделитесь своими наработками пожалуйста. П.С. Вот кусок программы, в котором я пытаюсь скачать файлики с сервера, список получаю, а вот файл /файлы / скачать не удается... [more] curl_global_init() IF ! Empty( curl := curl_easy_init() ) DEFAULT cDL TO "ftp://"+ArmFTP+"/" curl_easy_setopt( curl, HB_CURLOPT_DOWNLOAD ) curl_easy_setopt( curl, HB_CURLOPT_DIRLISTONLY) curl_easy_setopt( curl, HB_CURLOPT_USERPWD, ArmLogin+":"+ArmPass ) curl_easy_setopt( curl, HB_CURLOPT_URL, cDL+"OUT"+"/"+ArmPostID+"/"+dt2+"/" ) curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) curl_easy_perform( curl ) //DOWNLOAD DIRLIST TO STRING dnfiles:= curl_easy_dl_buff_get( curl ) MsgInfo(dnfiles) curl_easy_reset( curl ) //получаю список файлов на сервере DEFAULT cDL TO "ftp://"+ArmFTP+"/" curl_easy_setopt( curl, HB_CURLOPT_DOWNLOAD ) curl_easy_setopt( curl, HB_CURLOPT_USERPWD, ArmLogin+":"+ArmPass ) curl_easy_setopt( curl, HB_CURLOPT_URL, cDL+"OUT"+"/"+ArmPostID+"/"+dt2+"/" ) curl_easy_setopt( curl, HB_CURLOPT_DL_FILE_SETUP, cFileName := "*.*" ) ??? по маске, либо через список не хочет. curl_easy_setopt( curl, HB_CURLOPT_FAILONERROR, .T. ) curl_easy_perform( curl ) MsgInfo("DOWNLOAD FILE _ FILENAME: ") а вот тут засада, файлы не скачиваются... нужна помощь. curl_easy_reset( curl ) curl_easy_cleanup( curl ) ENDIF curl_global_cleanup() [/more]

Ответов - 65, стр: 1 2 3 4 All

Dima: Eduard Забил я на HBCURL... Делаю все с помощью HBTIP , но есть непонятки с рядом провайдеров , точно как описано и у вас. В основном все работает нормально , НО есть не понятные провы у которых все глючит.....и хз почему. К одному как то обратились , оказалось он там какие то IP и DNS сцука не верно настроил , апосля перенастройки все заработало нормально. PS Как вариант можно пробнуть консольный вариант CURL Линк дам.

Eduard: Dima пишет: Как вариант можно пробнуть консольный вариант CURL Спасибо, не надо, есть у меня.

Softlog86: Я использую связь через функции из стандартной библиотеки Windows wininet.dll С приёмом-передачей файлов с длинными именами проблемы нет - использую только такие пример : 04231e1ae.20160615.60453.ready (ID-компьютера.дата.время.статус) Дату+время записываю в имя файла именно по причине какого-то глюка - сервер не всегда дату правильно отдаёт .... а это важно - например отчет о продаже . Вот примерно часть кода по приёму файла с FTP : hLib := LOADLIBRARY( "wininet.dll" ) // Используем "штатную" библиотеку Windows // открыли "интернет" + сделали соединение с FTP-сервером hInternet = INETOPEN( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 ) hConnect = INETCONNECT( hInternet, Имя_сервера_FTP, INTERNET_DEFAULT_FTP_PORT, Имя_пользователя_FTP, Пароль_FTP, INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE , 0 ) FTPGETFILE( hConnect,'request/ORDERS/'+(Имя_Скачиваемого_файла),System.Tempfolder+'\'+(имя_файла), 0, FILE_ATTRIBUTE_ARCHIVE, 0, 0 ) InetCloseHandle( hConnect) && закрыли соединение с сервером InetCloseHandle( hInternet) && закрыли соединение с Интернет Если нужно более развернуто - сообщай .


Eduard: Softlog86 пишет: Если нужно более развернуто - сообщай Да, нужно. Взято отсюда? http://forums.fivetechsupport.com/viewtopic.php?f=3&t=23075 Там в принципе все понятно, только не понятно с этой функцией по получению списка файлов, особенно данный фрагмент текста function FTPDirectory( cMask,cIP,cUser,cPass ) local hFTPDir, aFiles := {} local oWin32FindData, cBuffer local i:=0 default cMask := "*.*" STRUCT oWin32FindData MEMBER nFileAttributes AS DWORD MEMBER nCreationTime AS STRING LEN 8 MEMBER nLastReadAccess AS STRING LEN 8 MEMBER nLastWriteAccess AS STRING LEN 8 MEMBER nSizeHight AS DWORD MEMBER nSizeLow AS DWORD MEMBER nReserved0 AS DWORD MEMBER nReserved1 AS DWORD MEMBER cFileName AS STRING LEN 260 MEMBER cAltName AS STRING LEN 14 ENDSTRUCT hInternet = INTERNETOPEN( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 ) hConnect = INTERNETCONNECT( hInternet, cIP, INTERNET_INVALID_PORT_NUMBER, cUser, cPass, INTERNET_SERVICE_FTP, 0, 0 ) //msginfo(hConnect) if hConnect != nil cBuffer = oWin32FindData:cBuffer hFTPDir = FtpFindFirstFile( hConnect, cMask, @cBuffer, 0, 0 ) oWin32FindData:cBuffer = cBuffer if ! empty( oWin32FindData:cFileName ) aadd( aFiles, { oWin32FindData:cFileName,; oWin32FindData:nSizeLow } ) while InternetFindNextFile( hFTPDir, @cBuffer ) oWin32FindData:cBuffer = cBuffer aadd( aFiles, { oWin32FindData:cFileName,; oWin32FindData:nSizeLow } ) end endif InternetCloseHandle( hFTPDir ) endif for i=1 TO len(aFiles) msginfo(aFiles[i,1]) next i return aFiles Больше всего меня интересует получение файлов по маске, и потом скачивание их всех вместе за один раз.

Softlog86: скачиваю файлы по-одному , оказалось что время скачивания что группой что по одиночке почти одинаковое . Тем более что мне в процессе скачивания мне нужно ещё что-то с ними делать .... получение списка файлов по маске : function ftpDIR(cKAT, Mask) //******************************************************************************* // // создаём массив имён файлов из cKAT/ для маски MASK на сервере обновлений ..... // возвращаем МАССИВ {имя , дата} // //******************************************************************************* Local cUrl cUrl := "ftp://" + Alltrim( FTPUSERNAME )+":"+ Alltrim(FTPpassword ) +"@"+ alltrim(FTP_SERVER_NAME) oUrl := tURL():New( cUrl ) // IF Empty( oUrl ) return nil endif oClient := TIpClientFtp():new( oUrl, .F. ) IF Empty( oClient ) ; return nil ; endif oClient:nConnTimeout := 15000 // // Временем можно поиграть ... oClient:bUsePasv := .T. IF At( "@", FTPUSERNAME ) > 0 oClient:oUrl:cServer := FTP_SERVER_NAME oClient:oUrl:cUserID := FTPUSERNAME oClient:oUrl:cPassword := FTPPassword ENDIF IF oClient:Open() IF Empty( oClient:cReply ) oClient:Pasv() ELSE oClient:Pasv() ENDIF arFILES:={} arFILES:=FTPFILLDATETIME(cKAT, Mask ,oClient) // заполняем нужной информацией ELSE msgalert('Нет связи с сервером '+FTP_SERVER_NAME ,'Ошибка !') arFILES:={} ENDIF oClient:CLOSE() return aRFILES FUNCTION FtpFillDateTime(Katalog,cMask,oClient) LOCAL ctext, cSepChar, nPos, acDir, cLine, x, avalues, xpesq, xpos, cvalue, cvalue1 , aRET:={},a:={} LOCAL i clret:= oClient:PWD cpath := oClient:cReply cfolder:=cpath+"/"+KATALOG oClient:CWD(cfolder) a := oClient:Listfiles(cMask) oClient:reset() If LEN(a)>0 FOR i:=1 TO LEN(a) // { Файл.C , Дата.D , Время.C } // Коррекция времени ! TimEcorrection - так как на сервере идёт своё время ...... - прибавляем TimeCorrectionI (число секунд) Z:=SECTOTIME(TIMETOSEC(a[i,4])+TimeCorrectionI) AADD(aRET,{a[i,1] , a[i,3] , Z } ) NEXT i ENDIF // Возвращаем массив с { имя , дата , время } ) RETURN aRET

Dima: Eduard пишет: STRUCT oWin32FindData Это надо прицепить из FW source\classes\tstruct.prg include\struct.ch

Eduard: В какой библиотеке находиться функция LoadLibrary кто знает? Компилятор MinGw дает ошибку при этапе линковки программы C:/Users/Eduard/AppData/Local/Temp/hbmk_760jxf.dir/ft.o:ft.c:(.data+0xb28): unde fined reference to `HB_FUN_LOADLIBRARY' collect2.exe: error: ld returned 1 exit status hbmk2: Error: Running linker. 1 gcc.exe C:/Users/Eduard/AppData/Local/Temp/hbmk_760jxf.dir/ft.o C:/Users/Eduard/ AppData/Local/Temp/hbmk_760jxf.dir/hbmk_0kicmk.o f:/hmg/minigui/Samples/ft/_temp .o -m32 -mwindows -Wl,--start-group -lminigui -lhbprinter -lminiprint -lsocke t -ladordd -lcalldll -ltsbrowse -lhbct -lhbmisc -lhbtip -lhbziparc -lhbmzip -lmi nizip -lhbwin -lxhb -lmsvfw32 -lvfw32 -lcurldll -lhbcurl -lwininet -lhbextern -l hbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtstd -lgtpca -lgtwin -lgtwv t -lgtgui -lhbrdd -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -l gdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lh bpcre -lhbzlib -Wl,--end-group -oft.exe -Lf:/HMG/harbour/lib -Lf:/HMG/minigui /lib hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s): LOADLIBRARY() # hmg paths {win}incpaths=include {win}libpaths=lib {win}incpaths=${hb_curdir} # hmg resources {win}sources=${hb_curdir}_temp.o # gui mode {win}gt=gtgui # core {win}libs=minigui hbprinter miniprint socket # core additional binary {win}libs=adordd calldll tsbrowse # Harbour needed contrib {win}libs=hbct # Harbour additional contribs {win}libs=hbmisc hbtip hbziparc hbmzip minizip hbwin xhb # system {win}libs=msvfw32 vfw32 curldll hbcurl wininet hbwin

Softlog86: Eduard в файле .HBC Вашего проекта нужно добавить строчку : libpaths=c:\borland\bcc55\lib;c:\borland\lib\PSDK; Ну или как-то по-другому подключить .... Вроде как LOADLIBRARY() лежит в c:\borland\lib\PSDK\kernel32.lib

Dima: Eduard Кажись это FW source\winapi\dll.c Можно пробнуть hb_DynCall

Dima: Softlog86 пишет: libpaths=c:\borland\bcc55\lib;c:\borland\lib\PSDK; У него MINGW

Softlog86: Тогда понятно ....

SergKis: Eduard пишет В какой библиотеке находиться функция LoadLibrary MiniGui\SOURCE\Dll\_windll.c там есть

Eduard: Softlog86 пишет: hConnect = INETCONNECT( hInternet, Имя_сервера_FTP, INTERNET_DEFAULT_FTP_PORT, Имя_пользователя_FTP, Пароль_FTP, INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE , 0 ) Где можно посмотреть описания вот этих переменных что выделены жирным? есть какой ch-файл? Есть команда, для перехода в каталог, типа CWD?

Softlog86: Да , CWD () выбор директории Старая школа ещё помнит что такое 21-й порт :) #define FILE_ATTRIBUTE_ARCHIVE 128 #DEFINE FTP_TRANSFER_TYPE_UNKNOWN 0 #DEFINE FTP_TRANSFER_TYPE_ASCII 1 #DEFINE FTP_TRANSFER_TYPE_BINARY 2 #define INTERNET_INVALID_PORT_NUMBER 0 // use the protocol-specific default #DEFINE INTERNET_DEFAULT_FTP_PORT 21 // ' порт по умолчанию для FTP серверов #define INTERNET_DEFAULT_GOPHER_PORT 70 // " " gopher " #define INTERNET_DEFAULT_HTTP_PORT 80 // " " HTTP " #define INTERNET_DEFAULT_HTTPS_PORT 443 // " " HTTPS " #define INTERNET_DEFAULT_SOCKS_PORT 1080 // default for SOCKS firewall servers. #DEFINE INTERNET_SERVICE_FTP 1 #define INTERNET_SERVICE_GOPHER 2 #define INTERNET_SERVICE_HTTP 3 #DEFINE INTERNET_FLAG_PASSIVE 134217728 // used for FTP connections #DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0 // Use registry configuration #DEFINE INTERNET_OPEN_TYPE_DIRECT 1 // direct to net #DEFINE INTERNET_OPEN_TYPE_PROXY 3 // via named proxy #DEFINE INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 4 // prevent using java/script/INS

Dima: Eduard По поводу функций wininet https://searchcode.com/codesearch/view/4487644/

Eduard: Dima пишет: По поводу функций wininet https://searchcode.com/codesearch/view/4487644/ Спасибо, пригодиться. Вчера на скорую руку закончил проект, но надо еще внести пару правок в программу, т.к. сроки на работе поджимают. Есть возможность добавить ПрогрессБар к функции для приема/передачи файлов, что-то такое похожее на это?: Когда был HBTip то функция работала. oFtp:exGauge := { | done, size| ShowGaugePriem( done, size ) } PROCEDURE ShowGaugePriem( nSent, nSize ) Local nValue nValue := 100 * nSent/nSize IF nSent > 0 ft.Text_1.Value := Str(nValue,3)+" %" ft.ProgressBar_1.value := nValue DO EVENTS ENDIF RETURN

Dima: Eduard Это ведь Минигуи если я верно понял. Что то мне кажется что юзая функции "wininet.dll" не получится сделать ПрогрессБар (возможно ошибаюсь) Поэтому вижу варианты: 1. Повесить в окне "крутилку" , примеры есть 2. Заюзать AVI файл , типа как для копирования 3. Вывесить типа WAIT окна , "Ждите" 4. Повесить ПрогрессБар как в винде 10 , он бегает тудым сюдым И по ходу если файлы по размерам не очень большие , то и смысла нет что то вешать.

Softlog86: Дима верно всё говорит . Поэтому я и передаю файлы по-одиночке и завязываю это событие на прогресс-бар . (Поди не Дуал-ап - Интернет ? ) Моих юзеров при всяких операциях с фтп-приемом-передачей задержки не напрягают . На уровне открытия тяжелой страницы сайта . Да и их в это время можно чем-то занять (см Дима ) :) Большие , даже огромные , dbf файлы зипуются в очень компактную пачку . В любом случае передача быстрая . Для очень больших файлов есть смысл предусмотреть контроль полученного файла хотя-бы на уровне размера . Ох уж эта вредная привычка еще с CLIPPERовских времён всё экономить : память , размеры полей , "чтоб всё летало" :)

Eduard: Dima пишет: И по ходу если файлы по размерам не очень большие , то и смысла нет что то вешать. Да, файлики не большие от 5 кб. и до 100-120 кб. в редких случаях до 200. Все дело в том, что там где данная программа используется очень плохие каналы связи, стоят модемы от Укртелекома АДСЛ корпоративный канал до 128 - 512 кб/с. В основном скорость 128 кб./с Хотелось бы видеть процесс закачки. п.с. Предприятие ПАТ "Укрпошта", вот такие каналы стоят в отделениях свази.

Eduard: Eduard пишет: Для очень больших файлов есть смысл предусмотреть контроль полученного файла хотя-бы на уровне размера . Да такое у меня предусмотрено, идет проверка на контрольную сумму, crc посредством фтп-сервера.



полная версия страницы