用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

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

在SSH的基础上使用jquery.uploadify.js上传文件

在SSH框架的基础上,使用jquery.uploadify.js实现文件的上传,之前搞了好几天,都上传不了, 在Action那边File接收到的总是为null, 为了这个还上网搜了好多相关的信息,但都不行,最后还是搜到一篇文章帮助到我了,希望能帮助到为之困扰的人。 jsp页面的关键代码: <link rel="stylesheet" type="text/css" href="${page

Tomcat下载压缩包解压后应有如下文件结构

1、bin:存放启动和关闭Tomcat的命令的路径。 2、conf:存放Tomcat的配置,所有的Tomcat的配置都在该路径下设置。 3、lib:存放Tomcat服务器的核心类库(JAR文件),如果需要扩展Tomcat功能,也可将第三方类库复制到该路径下。 4、logs:这是一个空路径,该路径用于保存Tomcat每次运行后产生的日志。 5、temp:保存Web应用运行过程中生成的临时文件

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

控制台和MFC中内存泄露工具vld的使用

最近想检测下项目中内存泄露的情况,选中了vld这款。在查找使用方法的时候,大都是控制台下的示例,添加到main函数所在的源文件上。换成MFC就纠结了,不知道添加到哪里去。本文记录控制台和MFC中的使用vld过程。    vld资源:    1)、大家可以移步下边的网址下载:     http://vld.codeplex.com/releases/view/82311    2

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD