Автор | Сообщение |
|
| |
Пост N: 65
Зарегистрирован: 02.07.12
|
|
Отправлено: 25.03.17 18:45. Заголовок: HBCURL
Dima пишет: цитата: | Вот и все непонятки закончились после того как убил кучу времени. У DownloadFile проблема с длинными именами файлов , при чем в UploadFile этой проблемы нет. Не важно каков размер файла , важна для него длина имени файла. Прошу опровергнуть или подтвердить описанное поведение DownloadFile. |
| Добрый день. У меня точно такая же проблема нарисовалась в моей программе, как описывает Дима. Программа на отрез не хочет принимать с фтп длинные имена файлов. точь в точь как в этой теме http://clipper.borda.ru/?1-4-0-00000844-000-10001-0 Удалось ли Вам побороть данную проблему.? Как вышли из ситуации? Хочу перейти на HBCURL, но нужно описание всех функций, особенно получение списка файлов с фтп-сервера по маске и скачивание файлов с сервера. Поделитесь своими наработками пожалуйста. П.С. Вот кусок программы, в котором я пытаюсь скачать файлики с сервера, список получаю, а вот файл /файлы / скачать не удается... Скрытый текст 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()
|
|
|
|
Новых ответов нет
, стр:
1
2
3
4
All
[см. все]
|
|
|
| |
Пост N: 1076
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.03.17 22:30. Заголовок: Dima пишет: о то мн..
|
|
|
|
| |
Пост N: 6346
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.17 22:47. Заголовок: Haz пишет: Пишу ..
Haz пишет: цитата: | Пишу "возможно" тк сам не пробовал |
| Аналогично
|
|
|
|
| |
Пост N: 348
Зарегистрирован: 03.12.08
|
|
Отправлено: 28.03.17 13:48. Заголовок: тем более если файли..
тем более если файлики маленькие , зачем прогресс-бар ? Ставить прогресс на всю очередь и делу конец . Даже по диал-апу 50к/б файл зальётся за секунду Эдуард , получилось из наших советов что хотел ?
|
|
|
|
| |
Пост N: 73
Зарегистрирован: 02.07.12
|
|
Отправлено: 28.03.17 19:12. Заголовок: Softlog86 пишет: Эд..
Softlog86 пишет: цитата: | Эдуард , получилось из наших советов что хотел ? |
| Да, все работает.
|
|
|
|
| постоянный участник
|
Пост N: 687
Зарегистрирован: 13.10.05
|
|
Отправлено: 05.04.17 18:24. Заголовок: Eduard Да, все рабо..
Eduard А как бы поделится самодостаточным необльшим примером, а то материалов по этой теме не густо.
|
|
|
|
| |
Пост N: 74
Зарегистрирован: 02.07.12
|
|
Отправлено: 05.04.17 22:07. Заголовок: Да, без проблем, вот..
Да, без проблем, вот процедура из моей программы: Скрытый текст Procedure ImpMailObmen() LOCAL curl, aGauge, nPos := 1 LOCAL a, tt, dt2, cFile, hInternet, hConnect, dlfiles olddir:= DIRCHANGE() DIRCHANGE(ArmImpDir) tt:=InputBoxDate("Введите дату отправки почты из обмена","Дата", DATE()) dt2:=SUBSTR(DTOC(tt),1,2)+"-"+SUBSTR(DTOC(tt),4,2)+"-"+SUBSTR(DTOC(tt),9,2) // формат папки на сервере 02-01-13 cFile := "CM"+BazaObmen+ArmPostID+"*"+"."+"*" addtextList2("Ждите, идет получение почты с сервера") dlfiles := ftpDIRArmVZ("OUT"+"/"+ArmPostID+"/"+dt2+"/", cFile) //получаем список файлов сервера по маске // открыли "интернет" + сделали соединение с FTP-сервером hInternet = INTERNETOPEN( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 ) if hInternet <> 0 hConnect = INTERNETCONNECT( hInternet, ArmFTP, INTERNET_DEFAULT_FTP_PORT, ArmLogin, ArmPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE , 0 ) // ArmFTP - имя сервера ФТП, //ArmLogin, ArmPass - Логин и Пароль для доступа к серверу FTPSETCURRENTDIRECTORY(hConnect, "OUT") //переходим в нужную директорию на сервере... FTPSETCURRENTDIRECTORY(hConnect, ArmPostID) IF FTPSETCURRENTDIRECTORY(hConnect, dt2) IF Len( dlfiles ) > 0 FOR EACH cFile IN dlfiles FTPGETFILE( hConnect, cFile[F_NAME], ArmImpDir+cFile[F_NAME], 0, FTP_TRANSFER_TYPE_UNKNOWN, 0, 0 ) //получаем файлы addtextList2("Файл "+cFile[F_NAME] +" получен с сервера") NEXT ENDIF addtextList2("Вся почта была удачно получена!") MsgInfo("Вся почта была удачно получена!") ELSE MsgStop("На сервере отсутствует почта за дату "+DTOC(tt)) return 0 INTERNETCLOSEHANDLE( hConnect) && закрыли соединение с сервером INTERNETCLOSEHANDLE( hInternet) && закрыли соединение с Интернет ENDIF ELSE msgalert('Нет связи с сервером '+ArmFTP ,'Ошибка !') return 0 INTERNETCLOSEHANDLE( hConnect) && закрыли соединение с сервером INTERNETCLOSEHANDLE( hInternet) && закрыли соединение с Интернет ENDIF RETURN ******* function ftpDIRArmVZ(cKAT, Mask) //dir, maska Local cUrl cUrl := "ftp://" + Alltrim( ArmLogin )+":"+ Alltrim( ArmPass ) +"@"+ alltrim( ArmFTP ) //ftpusername, ftpuserpassword, ftpserver oUrl := tURL():New( cUrl ) // IF Empty( oUrl ) return nil endif oClient := TIpClientFtp():new( oUrl, .F. ) IF Empty( oClient ) ; return nil ; endif oClient:nConnTimeout := 20000 // // Временем можно поиграть ... oClient:bUsePasv := .T. IF At( "@", ArmLogin ) > 0 oClient:oUrl:cServer := ArmFTP oClient:oUrl:cUserID := ArmLogin oClient:oUrl:cPassword := ArmPass ENDIF IF oClient:Open() IF Empty( oClient:cReply ) oClient:Pasv() ELSE oClient:Pasv() ENDIF arFILES:={} arFILES:=FTPFILLARMVZ(cKAT, Mask ,oClient) // заполняем нужной информацией ELSE msgalert('Нет связи с сервером '+ArmFTP ,'Ошибка !') return 0 arFILES:={} ENDIF oClient:CLOSE() return aRFILES ******* FUNCTION FTPFILLARMVZ(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 *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
| Ну и собственно, сами функции для работы с ФТП-сервером Объявления переменных в главной программе Скрытый текст #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 ****************** Функции: #pragma BEGINDUMP #include "windows.h" #include "wininet.h" #include "hbapi.h" HB_FUNC( INTERNETOPEN ) { hb_retnl( ( LONG ) InternetOpen( hb_parc( 1 ), hb_parnl( 2 ), hb_parc( 3 ), hb_parc( 4 ), hb_parnl( 5 ) ) ); } HB_FUNC( INTERNETCLOSEHANDLE ) { hb_retl( InternetCloseHandle( ( HINTERNET ) hb_parnl( 1 ) ) ); } HB_FUNC( INTERNETCONNECT ) { hb_retnl( ( LONG ) InternetConnect( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), ( INTERNET_PORT ) hb_parnl( 3 ), hb_parc( 4 ), hb_parc( 5 ), hb_parnl( 6 ), hb_parnl( 7 ), hb_parnl( 8 ) ) ); } HB_FUNC( FTPGETFILE ) { hb_retl( FtpGetFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), hb_parc( 3 ), hb_parl( 4 ), hb_parnl( 5 ), hb_parnl( 6 ), hb_parnl( 7 ) ) ); } HB_FUNC( FTPPUTFILE ) { hb_retl( FtpPutFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), hb_parc( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) ) ); } HB_FUNC( FTPDELETEFILE ) { hb_retl( FtpDeleteFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ) ) ); } HB_FUNC( FTPCREATEDIRECTORY ) { hb_retl( FtpCreateDirectory( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ) ) ); } HB_FUNC( FTPSETCURRENTDIRECTORY ) { hb_retl( FtpSetCurrentDirectory( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ) ) ); } HB_FUNC( FTPREMOVEDIRECTORY ) { hb_retl( FtpRemoveDirectory( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ) ) ); } HB_FUNC( FTPFINDFIRSTFILE ) { hb_retnl( ( LONG ) FtpFindFirstFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), ( WIN32_FIND_DATA * ) hb_parc( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) ) ); } HB_FUNC( INTERNETFINDNEXTFILE ) { hb_retl( InternetFindNextFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ) ) ); } HB_FUNC( INTERNETREADFILE ) { DWORD nBytesRead; BOOL lSuccess = InternetReadFile( ( HINTERNET ) hb_parnl( 1 ), ( LPVOID ) hb_parc( 2 ), hb_parclen( 2 ), &nBytesRead ); if ( !lSuccess ) hb_retnl( -1 ); else hb_retnl( nBytesRead ); } HB_FUNC( INTERNETWRITEFILE ) { DWORD nBytesWritten; BOOL lSuccess = InternetWriteFile( ( HINTERNET ) hb_parnl( 1 ), hb_parc( 2 ), hb_parnl( 3 ), &nBytesWritten ); hb_retl( lSuccess ); } #pragma ENDDUMP
|
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 09.11.06
|
|
Отправлено: 25.04.17 12:12. Заголовок: Как сменить директорию?
Подскажите как в hbcurl при подключении по ftp, сменить директорию.
|
|
|
|
| |
Пост N: 6387
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.04.17 13:58. Заголовок: Gosha Наверное так ..
Gosha Наверное так curl_easy_setopt( curl, HB_CURLOPT_URL, cDL ) где cDL твоя "дорога"
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 09.11.06
|
|
Отправлено: 25.04.17 14:48. Заголовок: Dima, не выходит
При попытке сделать, например: curl_easy_setopt( curl, HB_CURLOPT_URL, "ftp://user:pass@192.168.1.1/home/MOJCATALOG/mojfailik.txt" ) я поподаю не в /home/MOJCATALOG/, а в /home/user/.
|
|
|
|
| |
Пост N: 6388
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.04.17 14:56. Заголовок: Gosha Логин и пасс ..
Gosha Логин и пасс вроде отдельно задаются HB_CURLOPT_USERNAME HB_CURLOPT_PASSWORD или HB_CURLOPT_USERPWD примерчик
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 09.11.06
|
|
Отправлено: 25.04.17 16:52. Заголовок: Dima вопрос не в этом
В примере hbcurl - ftp_uldl.prg логинятся и так "ftp://harbour:power@localhost/". Но вопрос не в этом, логинюсь я номально (лог сервера подтверждает), а вот как мне перейти в другой каталог? т.е. как сделать cd /?
|
|
|
|
|
| |
Пост N: 6389
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.04.17 17:27. Заголовок: Gosha Можно погугли..
Gosha Можно погуглить например. https://ec.haxx.se/ftp-traversedir.html Или обратить внимание на это #define HB_CURLFTPMETHOD_DEFAULT 0 /* let libcurl pick */ #define HB_CURLFTPMETHOD_MULTICWD 1 /* single CWD operation for each path part */ #define HB_CURLFTPMETHOD_NOCWD 2 /* no CWD at all */ #define HB_CURLFTPMETHOD_SINGLECWD 3 /* one CWD to full dir, then work on file */ PS Возможно я ошибаюсь...
|
|
|
|
| |
Пост N: 7290
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.03.21 22:27. Заголовок: Простой вопрос есть ..
Простой вопрос есть , вроде. Хочу сделать так что бы моя программа если при запуске обнаруживает libcurl.dll тогда FTP запросы у меня работают через HBCURL , если не находит то работаем через HBTIP. Реализовать это все я смогу. Но есть проблема , программа при запуске сразу вылетает если не находит libcurl.dll , хотя первой строкой идет обычный WAIT "test" Как то можно это побороть ?
|
|
|
|
| постоянный участник
|
Пост N: 1626
Зарегистрирован: 09.10.06
|
|
Отправлено: 26.03.21 23:26. Заголовок: Dima пишет: Простой..
Dima пишет: цитата: | Простой вопрос есть , вроде. |
| Вопрос простой, ответ не очень. Вот здесь вы найдете причину вылета. А вот решите ли проблему.. А статически прилинковывать libcurl set HB_STATIC_CURL=yes не пробовали?
|
|
|
|
| |
Пост N: 7291
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.21 00:19. Заголовок: Петр пишет: А стати..
Петр пишет: цитата: | А статически прилинковывать libcurl set HB_STATIC_CURL=yes не пробовали? |
| С таким SET не собирается ) Compiling 'ftp_uldl.PRG'... Lines 372, Functions/Procedures 3 Generating C source output to 'obj\ftp_uldl.c'... Done. C:/MinGW12/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lssh2 collect2.exe: error: ld returned 1 exit status hbmk2[msklad]: Error: Running linker. 1 Почитал еще у Кресина и заюзал опции hbmk2 -shared -hbdynvm Собралось приложение но при запуске пишет что оно не приложение WIN32 ))
|
|
|
|
| |
Пост N: 7292
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.21 00:39. Заголовок: Хотел юзать LIBCURL...
Хотел юзать LIBCURL.DLL примерно так hLib := hb_LibLoad( "LIBCURL.DLL" ) ********** тут поюзали --------- hb_LibFree( hLib )
|
|
|
|
| постоянный участник
|
Пост N: 1630
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.03.21 00:40. Заголовок: Dima пишет: С таким..
Dima пишет: цитата: | С таким SET не собирается ) |
| С этой опцией должен собираться libcurl set HB_STATIC_CURL=yes Dima пишет: цитата: | Почитал еще у Кресина и заюзал опции hbmk2 -shared -hbdynvm |
| shared это для работы с harbour.dll а hbdynvm - create dynamic library (with linked Harbour VM), можно использовать в программах на C, PASCAL и пр.
|
|
|
|
| постоянный участник
|
Пост N: 1631
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.03.21 00:48. Заголовок: И еще из hbcurl.hbc ..
И еще из hbcurl.hbc # NOTE: Static mode requires additional libs be linked: # OpenSSL
|
|
|
|
| |
Пост N: 7293
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.21 01:02. Заголовок: Петр пишет: С этой ..
Петр пишет: цитата: | С этой опцией должен собираться libcurl set HB_STATIC_CURL=yes |
| Да тупанул , с ней и собрано
|
|
|
|
| |
Пост N: 7294
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.21 01:24. Заголовок: Собственно после сбо..
Собственно после сборки получил 3 либы libhbcurl.a libhbcurls.a liblibcurl.a Приложение собираю батником set path=C:\MinGW\bin\ c:\hb32mingw\bin\hbmk2 test.hbp содержимое test.hbp C:\hb32mingw\contrib\hbcurl\hbcurl.hbc -workdir=obj -otest.exe -std mytest.PRG Прога при запуске сразу хочет libcurl.dll и не стартует (если его нет) а хотелось бы рученятами когда нужно то грузить этот DLL и после использования выгружать. Не пойму как это сделать и возможно ли вообще , вот вопрос ?
|
|
|
Новых ответов нет
, стр:
1
2
3
4
All
[см. все]
|
|