用MFC 网络接口下载/上传文件

2024-05-30 08:38
文章标签 下载 mfc 上传 网络接口

本文主要是介绍用MFC 网络接口下载/上传文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个只是一个简单的测试程序

#include "afxinet.h"
#include <string>using namespace std;BOOL UploadFile(LPCTSTR strURL, //负责接收上传操作的页面的URLLPCTSTR strLocalFileName);  //待上传的本地文件路径BOOL CXXDlg::OnInitDialog()
{....///测试UploadFile(_T(""),_T("E:\\NT800\\vehicle\\DiagSoftware\\Display_Src\\Scan\\Upload\\20161223-090001.txt")) ;//SendFile();return TRUE;  // return TRUE  unless you set the focus to a control
}
CString MakeRequestHeaders(CString strBoundary)//包头
{CString strData;CString strFormat = _T("Content-Type: multipart/form-data; boundary=%s\r\n");//二进制文件传送Content-Type类型为: multipart/form-datastrData.Format(strFormat, strBoundary);return strData;
}
CString MakePreFileData(CString strBoundary, CString strFileName)
{CString strFormat;CString strData;strFormat += _T("--%s");strFormat += _T("\r\n");strFormat += _T("Content-Disposition: form-data; name=\"Filedata\"; filename=\"%s\"");//文件地址信息strFormat += _T("\r\n");strFormat += _T("Content-Type: application/octet-stream");strFormat += _T("\r\n\r\n");strData.Format(strFormat, strBoundary, strFileName);return strData;
}CString MakePostFileData(CString strBoundary)//发送请求包
{CString strFormat;CString strData;strFormat = _T("\r\n"); strFormat += _T("--%s");strFormat += _T("\r\n");strFormat += _T("Content-Disposition: form-data; name=\"Upload\"");strFormat += _T("\r\n\r\n");strFormat += _T("Submit Query");strFormat += _T("\r\n");strFormat += _T("--%s--");strFormat += _T("\r\n");strData.Format(strFormat, strBoundary, strBoundary);return strData;
}
BOOL GetResult(LPSTR lpStr, int& iRetCode, CString& strRetMsg)
{iRetCode = -1;strRetMsg = _T("");CString strResult /*= lpStr*/, strTmp = _T("");if(strResult.GetLength() == 0)return FALSE;int iStatus = strResult.Find(_T("\"status\":"));if(iStatus == -1)return FALSE;int iMsg = strResult.Find(_T("\"msg\":"));if(iMsg == -1)return FALSE;strTmp = strResult.Mid(iStatus+9,iMsg-iStatus-9);// 1, strTmp.Trim();strTmp.TrimRight(_T(","));iRetCode = _tcstod(strTmp,NULL);int iName = strResult.Find(_T("\"name\":"));if(iName == -1)return FALSE;strTmp = strResult.Mid(iMsg+6,iName-iMsg-6);// "上传文件成功!", strTmp.Trim();strTmp.TrimRight(_T(","));strRetMsg = strTmp;return TRUE;
}
BOOL CTestHTTPDlg::SendFile( )//发送数据
{CString defServerName = _T("www.xxx.com");//服务器名,可以是IP,也可以是网站名称CString defObjectName = _T("/function/upload.ashx?serial=20161223105745_             ");//保存的地址// USES_CONVERSION;CInternetSession Session;CHttpConnection *pHttpConnection = NULL;INTERNET_PORT   nPort = 80;///服务器端口这个很重要CFile fTrack;CHttpFile* pHTTP=NULL;CString strHTTPBoundary;CString strPreFileData;CString strPostFileData;DWORD dwTotalRequestLength;DWORD dwChunkLength;DWORD dwReadLength;DWORD dwResponseLength;TCHAR szError[MAX_PATH];void* pBuffer;LPSTR szResponse;BOOL bSuccess = TRUE;if (!fTrack.Open(_T("Upload.zip"), CFile::modeRead | CFile::shareDenyWrite))return FALSE;strHTTPBoundary = _T("-------------------------7b4a6d158c9");//定义边界值strPreFileData = MakePreFileData(strHTTPBoundary, _T("Upload.zip"));strPostFileData = MakePostFileData(strHTTPBoundary);int iLenFileUpload = fTrack.GetLength();dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + iLenFileUpload;//计算整个包的总长度dwChunkLength = 64 * 1024;pBuffer = malloc(dwChunkLength);if (NULL == pBuffer)return FALSE;try{
#if 0 //test serverunsigned short usPort;       //用于保存目标HTTP服务端口CString strServer, strObject;   //strServer用于保存服务器地址,strObject用于保存文件对象名称  DWORD dwServiceType=AFX_INET_SERVICE_HTTP;      //dwServiceType用于保存服务类型//解析URL,获取信息  if(!AfxParseURL(strPostFileData, dwServiceType, strServer, strObject, usPort))  {  //解析失败,该Url不正确  return -1;  } 
#endifpHttpConnection = Session.GetHttpConnection(defServerName,nPort);pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);pHTTP->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));//发送包头请求pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);#if 0DWORD dwRetCode = 0;pHTTP->QueryInfoStatusCode(dwRetCode);if (dwRetCode != HTTP_STATUS_OK){CString err;err.Format(_T("POST error, error ID: %d"), dwRetCode);TRACE(err);}
#endif#ifdef _UNICODEpHTTP->Write(strPreFileData, strPreFileData.GetLength());
#elsepHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());//写入服务器所需信息
#endifdwReadLength = -1;while (0 != dwReadLength){float fPercent = ((float)fTrack.GetPosition())/((float)iLenFileUpload);dwReadLength = fTrack.Read(pBuffer, dwChunkLength);if (0 != dwReadLength){pHTTP->Write(pBuffer, dwReadLength);//写入服务器本地文件,用二进制进行传送}}#ifdef _UNICODEpHTTP->Write(strPostFileData, strPostFileData.GetLength());
#elsepHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
#endifpHTTP->EndRequest(HSR_SYNC);dwResponseLength = pHTTP->GetLength();                   while (0 != dwResponseLength)                            {szResponse = (LPSTR)malloc(dwResponseLength + 1);      szResponse[dwResponseLength] = '\0';pHTTP->Read(szResponse, dwResponseLength);DWORD dwRetCode = 0;pHTTP->QueryInfoStatusCode(dwRetCode);int iRetCode = -1;CString strRetMsg = _T("");GetResult(szResponse,iRetCode,strRetMsg);free(szResponse);dwResponseLength = pHTTP->GetLength();if((iRetCode != 1)||(dwRetCode != HTTP_STATUS_OK))bSuccess = FALSE;}} catch (CException* e){e->GetErrorMessage(szError, MAX_PATH);e->Delete();//     AfxMessageBox(szError);bSuccess = FALSE;}pHTTP->Close();delete pHTTP;fTrack.Close();if (NULL != pBuffer){free(pBuffer);}return bSuccess;
}BOOL UploadFile(LPCTSTR strURL, //负责接收上传操作的页面的URLLPCTSTR strLocalFileName)  //待上传的本地文件路径
{ASSERT(strURL != NULL && strLocalFileName != NULL);BOOL bResult = FALSE;DWORD dwType = 0;CString strServer=_T("www.foxwelltech.com");CString strObject = _T("/function/upload.ashx?serial=20161223105745_             ");INTERNET_PORT wPort = 80;DWORD dwFileLength = 0;char * pFileBuff = NULL;CHttpConnection * pHC = NULL;CHttpFile * pHF = NULL;CInternetSession cis;
//  bResult =  AfxParseURL(strURL, dwType, strServer, strObject, wPort);
//  if(!bResult)
//      return FALSE;CFile file;try{if(!file.Open(strLocalFileName, CFile::shareDenyNone | CFile::modeRead))return FALSE;dwFileLength = file.GetLength();if(dwFileLength <= 0)return FALSE;pFileBuff = new char[dwFileLength];memset(pFileBuff, 0, sizeof(char) * dwFileLength);file.Read(pFileBuff, dwFileLength);const int nTimeOut = 5000;cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //联接超时设置cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);  //重试1次pHC = cis.GetHttpConnection(strServer, wPort);  //取得一个Http联接//pHC = cis.GetHttpConnection(_T("www.baidu.com"), (INTERNET_PORT)(80) );  //取得一个Http联接pHF = pHC->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);if(!pHF->SendRequest(NULL, 0, pFileBuff, dwFileLength)){delete[]pFileBuff;pFileBuff = NULL;pHF->Close();pHC->Close();cis.Close();return FALSE;}DWORD dwStateCode = 0;pHF->QueryInfoStatusCode(dwStateCode);if(dwStateCode == HTTP_STATUS_OK)bResult = TRUE;}catch(CInternetException * pEx){LPTSTR sz;CString str = _T("InternetException occur!\r\n");pEx->GetErrorMessage(sz, 25);str += sz;AfxMessageBox(str);}catch(CFileException& fe){CString str;str.Format(_T("FileException occur!\r\n%d"), fe.m_lOsError);AfxMessageBox(str);}catch(...){DWORD dwError = GetLastError();CString str;str.Format(_T("Unknow Exception occur!\r\n%d"), dwError);AfxMessageBox(str);}delete[]pFileBuff;pFileBuff = NULL;file.Close();pHF->Close();pHC->Close();cis.Close();return bResult;
}

这篇关于用MFC 网络接口下载/上传文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015998

相关文章

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

GitLab文件的上传与下载方式

《GitLab文件的上传与下载方式》:本文主要介绍GitLab文件的上传与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录GitLab 项目拉取到本地GitLab 项目上传方法方法 1:本地项目未初始化Git方法 2:本地项目已初始化GitGitLab 上

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

在React聊天应用中实现图片上传功能

《在React聊天应用中实现图片上传功能》在现代聊天应用中,除了文字和表情,图片分享也是一个重要的功能,本文将详细介绍如何在基于React的聊天应用中实现图片上传和预览功能,感兴趣的小伙伴跟着小编一起... 目录技术栈实现步骤1. 消息组件改造2. 图片预览组件3. 聊天输入组件改造功能特点使用说明注意事项

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob