MFC通过URL下载并保存文件代码 转载
http://blog.csdn.net/charlessimonyi/article/details/8666108?utm_source=tuicool&utm_medium=referral
?
我們知道,windows有關網絡連接的API在wininet.h里,而在MFC里,這些API被封裝成了類。
CInternetSession類:直接繼承自CObject類,該類用來建立與某個Internet服務器的會話
CInternetConnection類:幫助用戶管理與Internet服務器的連接,同時還提供一些函數完成和響應服務器的通信
CInternetConnection類又派生出三個類:
CHttpConnection類:管理與HTTP服務器的連接
CFtpConnection類:用于管理與FTP服務器的連接
CGopherConnection類:管理與Gopher服務器的連接
?
我們要實現根據URL下載并保存文件,就需要CInternetSession、CHttpConnection、CHttpFile。
CHttpFile用來做什么呢?它可以關聯起URL指向的一個WEB對象,由于CHttpFile繼承與CFile,我們可以像讀取一個CFile文件一樣,把它從HTTP服務器上下載下來。
MFC就是通過對CHttpFile對象的讀寫來完成與HTTP服務器的對話的,包括GET/POST提交數據,接收數據。
?
下面就是我自己寫的一個根據URL下載并保存文件的函數,注意使用時需要在MFC項目的預編譯頭文件里加入#include <afxinet.h>,因為上面我提到的那些類全部在這個頭文件里。
第一參數為URL,第二個參數為保存路徑。
返回值:
0:成功下載保存
-1:URL不正確
-2:建立網絡連接失敗
-3:向服務器發起GET請求失敗
-4:服務器不接受請求
-5:參數一不能為空
-6:參數二不能為空
-7:保存文件時創建或寫入文件失敗
1 INT GetFile(const CString strUrl,const CString strSavePath) 2 { 3 //檢查傳入的兩個參數 4 if (strUrl.IsEmpty()) 5 return -5; 6 if (strSavePath.IsEmpty()) 7 return -6; 8 9 unsigned short nPort; //用于保存目標HTTP服務端口 10 CString strServer, strObject; //strServer用于保存服務器地址,strObject用于保存文件對象名稱 11 DWORD dwServiceType,dwRet; //dwServiceType用于保存服務類型,dwRet用于保存提交GET請求返回的狀態號 12 13 //解析URL,獲取信息 14 if(!AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort)) 15 { 16 //解析失敗,該Url不正確 17 return -1; 18 } 19 //創建網絡連接對象,HTTP連接對象指針和用于該連接的HttpFile文件對象指針,注意delete 20 CInternetSession intsess; 21 CHttpFile *pHtFile = NULL; 22 //建立網絡連接 23 CHttpConnection *pHtCon = intsess.GetHttpConnection(strServer,nPort); 24 if(pHtCon == NULL) 25 { 26 //建立網絡連接失敗 27 intsess.Close(); 28 return -2; 29 } 30 //發起GET請求 31 pHtFile = pHtCon->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject); 32 if(pHtFile == NULL) 33 { 34 //發起GET請求失敗 35 intsess.Close(); 36 delete pHtCon;pHtCon = NULL; 37 return -3; 38 } 39 //提交請求 40 pHtFile->SendRequest(); 41 //獲取服務器返回的狀態號 42 pHtFile->QueryInfoStatusCode(dwRet); 43 if (dwRet != HTTP_STATUS_OK) 44 { 45 //服務器不接受請求 46 intsess.Close(); 47 delete pHtCon;pHtCon = NULL; 48 delete pHtFile;pHtFile = NULL; 49 return -4; 50 } 51 //獲取文件大小 52 UINT nFileLen = (UINT)pHtFile->GetLength(); 53 DWORD dwRead = 1; //用于標識讀了多少,為1是為了進入循環 54 //創建緩沖區 55 CHAR *szBuffer = new CHAR[nFileLen+1]; 56 TRY 57 { 58 //創建文件 59 CFile PicFile(strSavePath,CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive); 60 while(dwRead>0) 61 { 62 //清空緩沖區 63 memset(szBuffer,0,(size_t)(nFileLen+1)); 64 //讀取到緩沖區 65 dwRead = pHtFile->Read(szBuffer,nFileLen); 66 //寫入到文件 67 PicFile.Write(szBuffer,dwRead); 68 } 69 //關閉文件 70 PicFile.Close(); 71 //釋放內存 72 delete []szBuffer; 73 delete pHtFile; 74 delete pHtCon; 75 //關閉網絡連接 76 intsess.Close(); 77 } 78 CATCH(CFileException,e) 79 { 80 //釋放內存 81 delete []szBuffer; 82 delete pHtFile; 83 delete pHtCon; 84 //關閉網絡連接 85 intsess.Close(); 86 return -7; //讀寫文件異常 87 } 88 END_CATCH 89 return 0; 90 }?
轉載于:https://www.cnblogs.com/wolfplan/p/5937965.html
總結
以上是生活随笔為你收集整理的MFC通过URL下载并保存文件代码 转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (计算机组成原理)第七章输入和输出系统-
- 下一篇: 3-5:类与对象中篇——默认成员函数之运