根据URL下载文件,C++实现,MFC框架

需要头文件afxinet.h

//返回值解析:
//  0:成功下载保存
//- 1:URL不正确
//- 2:建立网络连接失败
//- 3:向服务器发起GET请求失败
//- 4:服务器不接受请求
//- 5:参数一不能为空
//- 6:参数二不能为空
//- 7:保存文件时创建或写入文件失败
INT GetInternetFile(const CString fileUrl,const CString fileName){
    if (fileUrl.IsEmpty())
        return -5;
    unsigned short nPort;//服务器端口号
    CString Server, FileObject;
    DWORD dwServiceType, dwRet;//服务类型,GET请求的状态号
    //解析URL
    if (!AfxParseURL(fileUrl, dwServiceType, Server, FileObject, nPort)){
        //MessageBox(_T("解析URL失败"));
        return -1;
    }
    //创建网络连接对象,http连接对象指针和用于该连接的文件指针,注意delete
    CInternetSession intsess;
    CHttpFile * pHtFile = NULL;
    //建立连接
    CHttpConnection * pHtCon = intsess.GetHttpConnection(Server, nPort);
    if (pHtCon == NULL){
        intsess.Close();
        //MessageBox(_T("建立连接失败"));
        return -2;
    }
    //发起Get请求
    pHtFile = pHtCon->OpenRequest(CHttpConnection::HTTP_VERB_GET, FileObject);
    if (pHtFile == NULL){
        intsess.Close();
        delete pHtCon;
        pHtCon = NULL;
        //MessageBox(_T("Get请求失败"));
        return -3;
    }
    //提交请求
    pHtFile->SendRequest();
    //获取状态号
    pHtFile->QueryInfoStatusCode(dwRet);
    if (dwRet != HTTP_STATUS_OK){
        intsess.Close();
        delete pHtCon;
        pHtCon = NULL;
        delete pHtFile;
        pHtFile = NULL;
        //MessageBox(_T("服务器不接受请求"));
        return -4;
    }
    //获取文件大小
    UINT nFileLen = (UINT)pHtFile->GetLength();
    DWORD dwRead = 1;//用于表示读取的数量
    //创建缓冲区
    char * szBuffer = new char[nFileLen + 1];
    try{
        //创建文件,下载文件重命名为fileName
        CFile newFile(fileName, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
        while (dwRead>0){
            memset(szBuffer, 0, (size_t)(nFileLen + 1));
            dwRead = pHtFile->Read(szBuffer, nFileLen);
            newFile.Write(szBuffer, dwRead);
        }
        newFile.Close();
        delete[]szBuffer;
        delete pHtFile;
        delete pHtCon;
        intsess.Close();
    }
    catch(CFileException e){
        delete[] szBuffer;
        delete pHtFile;
        delete pHtCon;
        intsess.Close();
        //MessageBox(_T("文件读写异常"));
        return -7;
    }
    return 0;
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值