VC 从网页上下载图片
2009-08-17 10:29
225 查看
显示网页上图片的方法:
(1)首先获取网页上我们所需要图片的链接地址(即URL);
(2)根据链接地址下载图片并保存在一个temp文件夹中;
(3)把刚刚下载的文件保存在所要显示的控件上;
(4)程序最后删除刚刚所下载的文件,即temp文件夹中的所有文件。
这里我主要是实现第二步,第一步的地址我们假设已经知道,例如本例中所用到的地址是http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg
这个是我在百度里随便百度找到的,如有侵权,望告知。
首先我们先来了解InternetOpenUrl 这个函数:
HINTERNET InternetOpenUrl (__in HINTERNET hInternet ,__in LPCTSTR lpszUrl ,__in LPCTSTR lpszHeaders ,__in DWORD值dwHeadersLength ,__in的DWORD dwFlags ,__in DWORD_PTR dwContext);
参数
hInternet
当前的 Internet 会话句柄。句柄必须由前期的 InternetOpen 调用返回。
lpszUrl
一个空字符结束的字符串变量的指针,指定读取的网址。只有以ftp:, gopher:, http:, 或者 https: 开头的网址被支持。
lpszHeaders
一个空字符结束的字符串变量的指针,指定发送到HTTP服务器的头信息。欲了解更多信息,请参阅HttpSendRequest函数里lpszHeaders参数的说明。
dwHeadersLength
额外的头的大小,以TCHAR为单位。如果这个参数是-1L并且lpszHeaders不是NULL,lpszHeaders被假设为零终止( ASCIIZ ),而长度被自动计算。
dwFlags
此参数可为下列值之一。
数值 说明
INTERNET_FLAG_EXISTING_CONNECT
如果使用相同的必须属性创建会话,会尝试利用现有的InternetConnect对象。这只对FTP操作非常有用,因为FTP是唯一在同一会话中执行多种操作的协议。WinINet API 为每个由InternetOpen产生的HINTERNET句柄缓冲一个单独链接句柄。InternetOpenUrl使用此标志的HTTP和FTP连接。
INTERNET_FLAG_HYPERLINK
当决定何时从网络重载时,如果服务器没有返回 Expires time 和 LastModified,那么强制重载。
INTERNET_FLAG_IGNORE_CERT_CN_INVALID
停用检查从服务器对必须的主机名称返回的SSL/PCT-based证书。 WinINet函数使用简单的比较匹配主机名称和通配符的规则检查证书。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
停用检查的SSL/PCT-based的证书的适当的有效日期。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明允许从HTTPS到HTTP URL的重定向。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明的允许的HTTP到HTTPS URL的重定向。
INTERNET_FLAG_KEEP_CONNECTION
如果可能的话,为连接使用保活语义。这个标志要求微软网络( MSN ),NTLM和其他类型的身份验证。
INTERNET_FLAG_NEED_FILE
如果要创建的文件不能被缓存,创建临时文件。
INTERNET_FLAG_NO_AUTH
不试图自动验证。
INTERNET_FLAG_NO_AUTO_REDIRECT
不自动处理HttpSendRequest中的重定向。
INTERNET_FLAG_NO_CACHE_WRITE
不添加返回实体到缓存。
INTERNET_FLAG_NO_COOKIES
不会自动添加的Cookie头到请求,并且不自动添加返回的cookie到cookie数据库。
INTERNET_FLAG_NO_UI
禁用Cookie的对话框。
INTERNET_FLAG_PASSIVE
使用被动FTP语义。InternetOpenUrl为FTP的文件和目录使用此标志。
INTERNET_FLAG_PRAGMA_NOCACHE
即使代理中存在缓存副本,也强制要求由源服务器返回。
INTERNET_FLAG_RAW_DATA
检索的Gopher目录信息时,传回的数据作为GOPHER_FIND_DATA结构,如果检索的FTP目录信息时,作为一个WIN32_FIND_DATA结构。如果此标志没有指定,或者请求通过CERN代理创建, InternetOpenUrl返回的HTML版本的目录。
INTERNET_FLAG_RELOAD
从原服务器强制下载所要求的文件,对象,或目录列表,而不是从缓存下载。
INTERNET_FLAG_RESYNCHRONIZE
重新加载的HTTP资源,如果资源在最后一次下载后已被修改。所有FTP和Gopher资源将被重载。
INTERNET_FLAG_SECURE
使用安全传输语义。这次传输使用安全套字节层/专用通信技术(的SSL / PCT ),这只有在HTTP请求时有意义。
dwContext
一个指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数。
返回值
如果已成功建立到FTP,Gopher,或HTTP URL的连接,返回一个有效的句柄,如果连接失败返回NULL。要检索特定的错误讯息,使用GetLastError 函数。要确定为什么对服务器的访问被拒绝,请调用InternetGetLastResponseInfo函数。
接着我们再学习一下InternetReadFile这个函数,这个大家自学,这里就不多说了。
下面是实例,在MFC下实现的
void CXXXDlg::OnBnClickedButton1()
{
LPCTSTR url =_T("http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg");
LPCTSTR fileName=_T("c://a1.jpg");//保存临时文件的地址
HINTERNET hNet= ::InternetOpen(_T(""), PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
HINTERNET hUrlFile = ::InternetOpenUrl(hNet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
char buffer[1024];
DWORD dwBytesRead = 1;
BOOL bRead = TRUE;
CFile file;
BOOL bCheck = file.Open(fileName,CFile::modeCreate|CFile::modeWrite);
if (bCheck == FALSE)
{
AfxMessageBox(_T("打开文件失败"));
return;
}
while ( bRead&&dwBytesRead>0 )
{
bRead = ::InternetReadFile(hUrlFile, buffer, sizeof(buffer), &dwBytesRead);
if( dwBytesRead>0 )
file.Write(buffer,dwBytesRead);
}
::InternetCloseHandle( hUrlFile );
::InternetCloseHandle( hNet );
file.Close();
}
(1)首先获取网页上我们所需要图片的链接地址(即URL);
(2)根据链接地址下载图片并保存在一个temp文件夹中;
(3)把刚刚下载的文件保存在所要显示的控件上;
(4)程序最后删除刚刚所下载的文件,即temp文件夹中的所有文件。
这里我主要是实现第二步,第一步的地址我们假设已经知道,例如本例中所用到的地址是http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg
这个是我在百度里随便百度找到的,如有侵权,望告知。
首先我们先来了解InternetOpenUrl 这个函数:
HINTERNET InternetOpenUrl (__in HINTERNET hInternet ,__in LPCTSTR lpszUrl ,__in LPCTSTR lpszHeaders ,__in DWORD值dwHeadersLength ,__in的DWORD dwFlags ,__in DWORD_PTR dwContext);
参数
hInternet
当前的 Internet 会话句柄。句柄必须由前期的 InternetOpen 调用返回。
lpszUrl
一个空字符结束的字符串变量的指针,指定读取的网址。只有以ftp:, gopher:, http:, 或者 https: 开头的网址被支持。
lpszHeaders
一个空字符结束的字符串变量的指针,指定发送到HTTP服务器的头信息。欲了解更多信息,请参阅HttpSendRequest函数里lpszHeaders参数的说明。
dwHeadersLength
额外的头的大小,以TCHAR为单位。如果这个参数是-1L并且lpszHeaders不是NULL,lpszHeaders被假设为零终止( ASCIIZ ),而长度被自动计算。
dwFlags
此参数可为下列值之一。
数值 说明
INTERNET_FLAG_EXISTING_CONNECT
如果使用相同的必须属性创建会话,会尝试利用现有的InternetConnect对象。这只对FTP操作非常有用,因为FTP是唯一在同一会话中执行多种操作的协议。WinINet API 为每个由InternetOpen产生的HINTERNET句柄缓冲一个单独链接句柄。InternetOpenUrl使用此标志的HTTP和FTP连接。
INTERNET_FLAG_HYPERLINK
当决定何时从网络重载时,如果服务器没有返回 Expires time 和 LastModified,那么强制重载。
INTERNET_FLAG_IGNORE_CERT_CN_INVALID
停用检查从服务器对必须的主机名称返回的SSL/PCT-based证书。 WinINet函数使用简单的比较匹配主机名称和通配符的规则检查证书。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
停用检查的SSL/PCT-based的证书的适当的有效日期。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明允许从HTTPS到HTTP URL的重定向。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明的允许的HTTP到HTTPS URL的重定向。
INTERNET_FLAG_KEEP_CONNECTION
如果可能的话,为连接使用保活语义。这个标志要求微软网络( MSN ),NTLM和其他类型的身份验证。
INTERNET_FLAG_NEED_FILE
如果要创建的文件不能被缓存,创建临时文件。
INTERNET_FLAG_NO_AUTH
不试图自动验证。
INTERNET_FLAG_NO_AUTO_REDIRECT
不自动处理HttpSendRequest中的重定向。
INTERNET_FLAG_NO_CACHE_WRITE
不添加返回实体到缓存。
INTERNET_FLAG_NO_COOKIES
不会自动添加的Cookie头到请求,并且不自动添加返回的cookie到cookie数据库。
INTERNET_FLAG_NO_UI
禁用Cookie的对话框。
INTERNET_FLAG_PASSIVE
使用被动FTP语义。InternetOpenUrl为FTP的文件和目录使用此标志。
INTERNET_FLAG_PRAGMA_NOCACHE
即使代理中存在缓存副本,也强制要求由源服务器返回。
INTERNET_FLAG_RAW_DATA
检索的Gopher目录信息时,传回的数据作为GOPHER_FIND_DATA结构,如果检索的FTP目录信息时,作为一个WIN32_FIND_DATA结构。如果此标志没有指定,或者请求通过CERN代理创建, InternetOpenUrl返回的HTML版本的目录。
INTERNET_FLAG_RELOAD
从原服务器强制下载所要求的文件,对象,或目录列表,而不是从缓存下载。
INTERNET_FLAG_RESYNCHRONIZE
重新加载的HTTP资源,如果资源在最后一次下载后已被修改。所有FTP和Gopher资源将被重载。
INTERNET_FLAG_SECURE
使用安全传输语义。这次传输使用安全套字节层/专用通信技术(的SSL / PCT ),这只有在HTTP请求时有意义。
dwContext
一个指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数。
返回值
如果已成功建立到FTP,Gopher,或HTTP URL的连接,返回一个有效的句柄,如果连接失败返回NULL。要检索特定的错误讯息,使用GetLastError 函数。要确定为什么对服务器的访问被拒绝,请调用InternetGetLastResponseInfo函数。
接着我们再学习一下InternetReadFile这个函数,这个大家自学,这里就不多说了。
下面是实例,在MFC下实现的
void CXXXDlg::OnBnClickedButton1()
{
LPCTSTR url =_T("http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg");
LPCTSTR fileName=_T("c://a1.jpg");//保存临时文件的地址
HINTERNET hNet= ::InternetOpen(_T(""), PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
HINTERNET hUrlFile = ::InternetOpenUrl(hNet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
char buffer[1024];
DWORD dwBytesRead = 1;
BOOL bRead = TRUE;
CFile file;
BOOL bCheck = file.Open(fileName,CFile::modeCreate|CFile::modeWrite);
if (bCheck == FALSE)
{
AfxMessageBox(_T("打开文件失败"));
return;
}
while ( bRead&&dwBytesRead>0 )
{
bRead = ::InternetReadFile(hUrlFile, buffer, sizeof(buffer), &dwBytesRead);
if( dwBytesRead>0 )
file.Write(buffer,dwBytesRead);
}
::InternetCloseHandle( hUrlFile );
::InternetCloseHandle( hNet );
file.Close();
}
相关文章推荐
- VC 从网页上下载图片
- c# 下载网页图片
- JAVA抓取网页图片并下载到本地
- URL,下载网页图片。
- c# 下载网页图片
- ios开发 uiwebview加载网页时阻止禁止取消图片下载
- php实现解析网页并下载图片到本地
- 利用urllib和beautiful soup下载网页图片
- Servlet实现将图片写入到网页和实现图片下载的功能
- Python下载网页图片
- 如何从网页中下载图片
- 贴一例:当所有图片下载完毕时,然后显示网页(有进度)
- [转]vb下载网页文件或图片的几种简易方法
- 一个小爬虫 从网页获取信息(图片下载)
- vc++ 下载远程图片
- Java实现网页截屏功能(图片下载功能)的几种方式(整理)
- Python入门小练习 002 批量下载网页链接中的图片
- Python3实现Web网页图片下载
- 简单爬虫源码,下载指定网页所有图片
- 用java下载一个网页图片