Search  
Thursday, May 24, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Aplicatii Web  Cum se verifica...
 Cum se verifica din VFP existenta unui fisier pe un site?
 
 12/17/2006 11:28:17 AM
User is offlinetatiana
7 posts


Cum se verifica din VFP existenta unui fisier pe un site?
 (Romania) Modified By tatiana  on 12/17/2006 10:09:30 PM)

Am o aplicatie locala realizata in VFP 8.0. Utilizatorului i se da posibilitatea sa deschida intr-o fereastra a aplicatiei fisiere PDF de pe un site (intranet). Numele pdf-ului se genereaza in functie de niste parametri dati de catre utilizator. Sunt insa si cazuri in care fisierul *.pdf cautat, nu este pe site la locatia cautata (pe site-ul implicit) si in acest caz ar trebui sa-l caute aplicatia la alta locatie si eventual sa informez si utilizatorul .

Eu nu stiu cum sa verific existenta fisierelor cautate pe site, astfel ca in functie de rezultatul acestei verificari sa lansez sau nu forma in care se deschide pdf-ul de pe site. Ma poate ajuta cineva? Multumesc.

Ma confrunt si cu o "problema" in privinta forumului PROFOX: nu mai "vad" fisierele atasate mesajelor...

Tatiana


Tatiana
 12/19/2006 10:42:23 AM
User is offlineDanTodor
297 posts
4th


Re: Cum se verifica din VFP existenta unui fisier pe un site?
 (Romania)
Daca este intr-adevar vorba de un site, asta inseamna un server de web, deci daca un fisier nu exista iti va returna codul de eroare 404, care il poti folosi ca hint pentru faptul ca acel fisier nu exista.
 12/19/2006 8:06:06 PM
User is offlinetatiana
7 posts


Re: Cum se verifica din VFP existenta unui fisier pe un site?
 (Romania)
Dar problema mea e ca nu stiu cum sa captez codul de eroare. (Nu am experienta de lucru cu servere web si nici in VFP nu-s teribil de priceputa).
Tatiana
 12/19/2006 11:27:06 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Cum se verifica din VFP existenta unui fisier pe un site?
 (N/A) Modified By Alex Dobrin  on 12/20/2006 12:41:51 AM)
Pentru a verifica daca exista un fisier pe un server poti folosii functia win32 FtpFindFirstFile.
Gasesti aici (http://www.news2news.com/vfp/?group=-1&function=70) modul de definire.
Cauta si cu Google functia si ai sa gasesti mai multe exemple. Din pacate acum nu am timp sa detaliez modul ei de folosire, dar daca nu te descurci revino cu intrebari.

Alex Dobrin
Algis Info
 5/21/2007 12:49:22 AM
User is offlineibaldazar
7 posts
www.hotscripts.ro


Re: Cum se verifica din VFP existenta unui fisier pe un site?
 (N/A) Modified By ibaldazar  on 5/21/2007 12:53:24 AM)
Eu stiu doua (trei)metode:

cea cu API: care este cea mai usor de utilizat( vezi erorile calumea) si  urmatoarea (cu MSXML2.ServerXMLHTTP -  care e mai scurta dar daca nu ai MSXML instalat nu o poti folosi)

#DEFINE AF_INET 2
#DEFINE SOCK_STREAM 1
#DEFINE IPPROTO_TCP 6
#DEFINE SOCKET_ERROR -1
#DEFINE INVALID_SOCKET -1
#DEFINE CrLf Chr(13)+Chr(10)

DO decl

IF WSAStartup(0x202, Repli(Chr(0),512)) = 0
getstring="http://www.hotscripts.ro/index.php"
= HTTPGetData(getstring)
= WSACleanup()

* cbuffer este rezultatul
?cbuffer
* aici poti sa verifici cu AT() daca codul de eroare 404 se afla in pagina... spui utilizatorului ca fisierul nu exista pe server

ENDIF

PROCEDURE HTTPGetData(cUrl)
#DEFINE READ_SIZE 1024 && marimea_bufferului

PUBLIC cServer, cIP, hSocket, cRq, cRecv, cBuffer
cServer = UrlGetServer(cUrl)
cIP = GetIP(cServer)

IF EMPTY(cIP)
MESSAGEBOX( "Serverul nu raspunde!" )
RETURN
ENDIF

cBuffer = ""


hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

IF hSocket = INVALID_SOCKET
MESSAGEBOX("Invalid socket" )
RETURN .F.
ENDIF

IF ConnectTo(hSocket, cIP, 80)
* aici facem requestu.. daca iti faci un server cu winsock si il pornesti pe 80 afli usor cam ce trebuie sa trimiti la un server ca sa-ti dea un fisier

cRq = "GET " + cUrl + " HTTP/1.0" + CrLf +;
"User-Agent: win32vfp" + CrLf +;
"Referer: www.referer.ro" + CrLf+CrLf
*sunt unele situri care cer ca refer sa fie chiar ele(masura de protectie anti spambot)

* trimiti requestul
IF send(hSocket, @cRq, Len(cRq), 0) <> SOCKET_ERROR
* ceri date pana se termina fisierul
cRecv = Repli(Chr(0), READ_SIZE)
DO WHILE .T.
nRecv = recv(hSocket, @cRecv, READ_SIZE, 0)
IF nRecv = 0
EXIT
ELSE
cBuffer = cBuffer + LEFT(cRecv, nRecv)

ENDIF
ENDDO
ENDIF
ENDIF
= closesocket(hSocket)

? "Rezultat:"+cbuffer
? Len(cBuffer), "bytes"

FUNCTION ConnectTo(hSocket, cHostIP, nPort)
* te conecteaza la un port printr-un anume socket (nu-ti bate capul:) )
LOCAL cBuffer, cPort, cHost
cPort = num2word(htons(nPort))
nHost = inet_addr(cHostIP)
cHost = num2dword(nHost)
cBuffer = num2word(AF_INET) + cPort + cHost + Repli(Chr(0),8)
RETURN (ws_connect(hSocket, @cBuffer, Len(cBuffer))=0)

FUNCTION IsDataAvailable(hSocket)
* checks if there is data available to read from the socket
LOCAL cRead, cWrite, cError, nCount
STORE num2dword(1) + num2dword(hSocket) TO cRead, cWrite, cError
nCount = ws_select(0, @cRead, @cWrite, @cError, 0)
RETURN (buf2dword(SUBSTR(cRead,1,4)) > 0)

FUNCTION GetIP(cServer)
* rezolva IP-u serverului : spre ex www.hotscripts.ro = 65.182.166.94
#DEFINE HOSTENT_SIZE 16
LOCAL nStruct, nSize, cBuffer, nAddr, cIP
nStruct = gethostbyname(cServer)
IF nStruct = 0
RETURN ""
ENDIF
cBuffer = Repli(Chr(0), HOSTENT_SIZE)
cIP = Repli(Chr(0), 4)
= CopyMemory(@cBuffer, nStruct, HOSTENT_SIZE)
= CopyMemory(@cIP, buf2dword(SUBS(cBuffer,13,4)),4)
= CopyMemory(@cIP, buf2dword(cIP),4)
RETURN inet_ntoa(buf2dword(cIP))

FUNCTION UrlGetServer(cUrl)
* scoate numele serverului din URL: din www.hotscripts.ro/file.pdf -> www.hotscripts.ro
#DEFINE URL_PART_HOSTNAME 2
LOCAL nBuflen, cBuffer
nBuflen = 1024
cBuffer = Repli(Chr(0), nBuflen)
= UrlGetPart(cUrl, @cBuffer, @nBuflen, URL_PART_HOSTNAME, 0)
RETURN SUBSTR(cBuffer, 1,AT(Chr(0),cBuffer)-1)

PROCEDURE decl
DECLARE INTEGER WSACleanup IN ws2_32
DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING lpWSAData
DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER tp, INTEGER pt
DECLARE INTEGER gethostbyname IN ws2_32 STRING host
DECLARE INTEGER closesocket IN ws2_32 INTEGER s
DECLARE INTEGER htons IN ws2_32 INTEGER hostshort
DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
DECLARE INTEGER inet_addr IN ws2_32 STRING cp

DECLARE INTEGER connect IN ws2_32 AS ws_connect;
INTEGER s, STRING @sname, INTEGER namelen

DECLARE INTEGER select IN ws2_32 AS ws_select;
INTEGER nfds, STRING @readfds, STRING @writefds,;
STRING @exceptfds, INTEGER tmout

DECLARE INTEGER send IN ws2_32;
INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags

DECLARE INTEGER recv IN ws2_32;
INTEGER s, STRING @buf, INTEGER buflen, INTEGER flags

DECLARE INTEGER UrlGetPart IN shlwapi;
STRING pszIn, STRING @pszOut, INTEGER @pcchOut,;
INTEGER dwPart, INTEGER dwFlags

DECLARE RtlMoveMemory IN kernel32 As CopyMemory;
STRING @Dest, INTEGER Src, INTEGER nLength

FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
BitLShift(Asc(SUBS(lcBuffer, 2,1)),8) +;
BitLShift(Asc(SUBS(lcBuffer, 3,1)),16) +;
BitLShift(Asc(SUBS(lcBuffer, 4,1)),24)

FUNCTION num2dword(lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
IF lnValue < 0
lnValue = 0x100000000 + lnValue
ENDIF
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)

FUNCTION num2word(lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))

***************************************************************** aici se termina primul exemplu (lung dar merge la sigur)

urmatorul exemplu prin MSXML2.ServerXMLHTTP

TRY

loXML = CreateObject("MSXML2.ServerXMLHTTP.6.0")
CATCH TO loError
TRY

loXML = CreateObject("MSXML2.ServerXMLHTTP")

CATCH TO loError2
TRY

loXML = CreateObject("WinHttp.WinHttpRequest.5.1")
CATCH TO loError3

RETURN ''
ENDTRY
RETURN ''
ENDTRY
ENDTRY


*INCERCI SA CREEZI OBIECTUL CARE SE POATE AFLA SUB MAI MULTE NUME PE WORKSTATION ( daca esti familiara cu AJAX la fel faci si acolo - pe diferite browsere obiectul WINHTTP are mai multe nume)

lcxml="http://www.hotscripts.ro"

loxml.Open("GET",lcxml,"false")
loxml.setRequestHeader("Referer","www.referer.ro")
loxml.setRequestHeader("Accept","image/gif, image/jpeg,image/pjpeg, text/plain, text/html, */*")
loxml.setRequestHeader("Content-Type","text/html")
loxml.setRequestHeader("Content-Length", ALLTRIM(STR(LEN(lcxml))))
loxml.send(lcxml)

STRTOFILE(loxml.responseText ,SYS(2023)+"\fisier.pdf")
release loxml

cam asta e.. mare grija la ultimul exemplu. pe unele MSXML-uri daca rezultatul nu este un string XML nu functioneaza ( nu stiu de ce. acelasi obiect folosit in ajax sau VB primeste oricealtceva)

a TREIA ar fi mai rusinoasa dar e cea mai usoara. folosesti un _WEBBROSER ( obiect implementat deja in fox) si cu ocazia asta iti arata pdf-u in fereastra ta si te-ai spalat pe maini. poti defini eveniment daca imi aduc bine aminte la terminarea citirii fisierului si iarasi, daca in raspuns se afla page 404 sau ceva de genu asta.. zici fisierul nu este gasit.
Iarasi. daca vrei sa folosesti obiectul asta.. si ai access la server. faci un 404.php si bagi niste setari in .htaccess si daca de ex. nu se gaseste fisierul pe server sa raspunda fisierul cu un fisierul nu este gasit.

te-am inebunit:)
ionut

  Visual FoxPro  Aplicatii Web  Cum se verifica...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement