使用FoxPro下载文件(HTTP)

使用FoxPro下载文件(HTTP),foxpro,visual-foxpro,Foxpro,Visual Foxpro,今天有人向我寻求有关FoxPro问题的帮助,关于如何通过HTTP下载文件 我发现了两件事:一件是付费ActiveX,另一件是需要libcurl 有没有一种方法可以做到这一点而不需要任何额外的东西(vfp8),比如Java中的HttpURLConnection?例如,通过使用Microsoft.XMLHTTP查看使用West Wind Web Connect。这是一个允许您编写可从web访问的VFP应用程序的框架。您可以在VFP中编写,但它需要注册Windows DLL以打开连接句柄,并调用以获取

今天有人向我寻求有关FoxPro问题的帮助,关于如何通过HTTP下载文件

我发现了两件事:一件是付费ActiveX,另一件是需要libcurl


有没有一种方法可以做到这一点而不需要任何额外的东西(vfp8),比如Java中的
HttpURLConnection
?例如,通过使用Microsoft.XMLHTTP查看使用West Wind Web Connect。这是一个允许您编写可从web访问的VFP应用程序的框架。

您可以在VFP中编写,但它需要注册Windows DLL以打开连接句柄,并调用以获取数据

另一种选择是使用自动化,例如使用Internet Explorer。您可以从VFP中创建一个ie对象,并调用其方法打开给定的URL,等待“就绪状态”完成,然后查看内容。至于尝试获取需要URL参数字符串的内容,您可以添加这些参数字符串,这没有问题,但如果需要POST变量,则需要付出更多的努力


正如Jerry提到的,西风工具非常强大,Rick Strahl从。。。我记得大约1993年。他的另一个工具是wwIPTools.DLL,它提供了更多的功能。

两个代码段可以工作,并且不需要额外的文件/DLL/flls/etc

Local loRequest, lcUrl, lcFilename

lcUrl = "http://example.com/foo.zip"
lcFilename = "C:\Temp\PSV.zip"

loRequest = Createobject('MsXml2.XmlHttp')
loRequest.Open("GET",lcUrl,.F.)
loRequest.Send()
StrToFile(loRequest.ResponseBody,lcFilename)


(摘自)

你也可以看看Craig Boyd的免费库,他还有一个优秀的免费JSON库。

选项1:

Declare Integer URLDownloadToFile In urlmon.dll As _apiURLDownloadToFile;
Integer pCaller, ;
String  szURL, ;
String  szFileName, ;
Integer dwReserved, ;
Integer lpfnCB
Declare Integer InternetOpen In wininet.dll As _apiInternetOpen ;
    String  lpszAgent, ;
    Integer dwAccessType, ;
    String  lpszProxy, ;
    String  lpszProxyBypass, ;
    Integer dwFlags

Declare Integer InternetOpenUrl In wininet.dll As _apiInternetOpenUrl ;
    Integer hInternet,;
    String  lpszUrl,;
    String  lpszHeaders,;
    Integer dwHeadersLength,;
    Integer dwFlags,;
    Integer dwContext

Declare Integer InternetReadFile In wininet.dll As _apiInternetReadFile ;
    Integer hFile, ;
    String  @lpBuffer, ;
    Integer dwNumberOfBytesToRead, ;
    Integer @lpdwNumberOfBytesRead

Declare Integer InternetCloseHandle In wininet.dll As _apiInternetCloseHandle ;
    Integer hInternet
只需让舒尔先从缓存中清除文件:

Declare Integer DeleteUrlCacheEntry In wininet.dll As _apiDeleteUrlCacheEntry ;
    String  lpszUrlName
或者在url的末尾添加一个随机参数,例如“?somerandomvalue”

选项2:

Declare Integer URLDownloadToFile In urlmon.dll As _apiURLDownloadToFile;
Integer pCaller, ;
String  szURL, ;
String  szFileName, ;
Integer dwReserved, ;
Integer lpfnCB
Declare Integer InternetOpen In wininet.dll As _apiInternetOpen ;
    String  lpszAgent, ;
    Integer dwAccessType, ;
    String  lpszProxy, ;
    String  lpszProxyBypass, ;
    Integer dwFlags

Declare Integer InternetOpenUrl In wininet.dll As _apiInternetOpenUrl ;
    Integer hInternet,;
    String  lpszUrl,;
    String  lpszHeaders,;
    Integer dwHeadersLength,;
    Integer dwFlags,;
    Integer dwContext

Declare Integer InternetReadFile In wininet.dll As _apiInternetReadFile ;
    Integer hFile, ;
    String  @lpBuffer, ;
    Integer dwNumberOfBytesToRead, ;
    Integer @lpdwNumberOfBytesRead

Declare Integer InternetCloseHandle In wininet.dll As _apiInternetCloseHandle ;
    Integer hInternet
这些函数的正确使用可在MSDN上找到


PS:您错过了这一个:

是我的
HttpClient.prg
文件(仅支持
获取
响应):

GET
请求的用法:

Local HttpClient
m.HttpClient = NEWOBJECT("HttpClientRequest","httpclient.prg")
m.HttpClient.Open("GET","http://servername/path/resourcename")
m.HttpClient.Send()
执行上述代码后,服务器响应包含在
m.HttpClient.responseBody
属性中,您可以将值存储到文件中,或者例如将图片存储到图像对象的
PictureVal
属性中:

STRTOFILE(m.HttpClient.responseBody,"c:\filename");

m.myform.AddObject("myimg",""image")
m.myform.myimg.PictureVal=m.HttpClient.responseBody

这是我在原始问题中粘贴的链接。唉,最新版本不起作用。