目录
回复讨论(解决方案)
首页 后端开发 php教程 WinInet模拟HTTP POST上传二进制文件流

WinInet模拟HTTP POST上传二进制文件流

Jun 23, 2016 pm 01:55 PM
http post 上传 二进制 模拟

BOOL CDllValidateDlg::PostHttpPage(CString &result,CString &PageName,CString &postData) // 请求Http.{	CInternetSession session("SighAgent");	try	{		INTERNET_PORT nPort = 80;		DWORD dwRet = 0;		/*以下为wininet 网络请求流程*/		CHttpConnection* pServer = session.GetHttpConnection(SERVER_IP, nPort);		CHttpFile* pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,PageName); //打开一个请求		CString strHeaders = "Content-Type: application/x-www-form-urlencoded"; // 请求头		//开始发送请求				string data_post = MultiByteToUtf8(postData.GetBuffer(0));		pFile->SendRequest(strHeaders,(LPVOID)data_post.data(),data_post.size()); //发送请求,注意此为堵塞函数		pFile->QueryInfoStatusCode(dwRet); //发送请求后,就查询发送的结果		if (dwRet == HTTP_STATUS_OK) //这个代表请求正确		{			CString str;			while(pFile->ReadString(str)) //开始返回返回结果 			{				char *pStr = (char*)str.GetBuffer(str.GetLength()); //取得str对象的原始字符串 				result = result + str; 			}			result = Utf8ToMultiByte(result.GetBuffer(0)).c_str();		}		else		{			SAFE_DELETE(pFile);			SAFE_DELETE(pServer);			return FALSE;		}		SAFE_DELETE(pFile);		SAFE_DELETE(pServer);	}	catch (CInternetException* pEx)	{		//catch errors from WinInet		TCHAR pszError[200];		pEx->GetErrorMessage(pszError, 200);		OutputDebugString(pszError);		return FALSE;	}	session.Close();	return TRUE;}
登录后复制

我在程序里用到上面这个PostHttpPage函数,来和服务器交互数据。
之前的一些数据上传都是字符串或整型数,没出现过问题。
现在想用这同一个函数,上传二进制形式的文件流,没有成功。请问我下面的做法是哪里错了?
//二进制导入图片文件	char buffer[102400];  //BUF_SIZE大小自己定义	FILE * pFile = fopen("photo.bmp", "rb");	int img = fread(buffer, sizeof(char), 102400, pFile);//	char stzimg[100];//	itoa(img,stzimg,10);//	AfxMessageBox(stzimg);//二进制导入图片文件结束	CString post_data;	post_data.Format("matchid='%s'&matchname='%s'&aid='%d'&ticket='%d'"		"&name='%s'&gender='%d'&folk='%s'&birthday='%s'&addr='%s'&cardid='%s'&expire='%s'&agency='%s'&face='%s'",		matchID,matchName,AID,ticket,		Name,abs(stricmp(Gender,"女")),Folk,BirthDay,Address,Code, ExpireEnd,   Agency,buffer); //请求的附加参数	CString result; //返回的结果	CString post_page = "test_id_validater/update_num.php"; //请求的php	PostHttpPage(result,post_page,post_data);
登录后复制


回复讨论(解决方案)

二进制考虑用BASE64编码等,然后Post

你确定html协议是这样传二进制文件的吗,先用wireshark查看下

我在网上找到上传文件的代码是这个样子的:

  #include <windows.h>  #include <wininet.h>  #include <iostream>  #define ERROR_OPEN_FILE       10  #define ERROR_MEMORY          11  #define ERROR_SIZE            12  #define ERROR_INTERNET_OPEN   13  #define ERROR_INTERNET_CONN   14  #define ERROR_INTERNET_REQ    15  #define ERROR_INTERNET_SEND   16  using namespace std;  int main()  {     // Local variables     static char *filename   = "test.txt";   //Filename to be loaded     static char *type       = "image/jpg";     static char boundary[]  = "pippo";            //Header boundary     static char nameForm[]  = "uploadedfile";     //Input form name     static char iaddr[]     = "localhost";        //IP address     static char url[]       = "test.php";         //URL     char hdrs[255];                  //Headers     char * buffer;                   //Buffer containing file + headers     char * content;                  //Buffer containing file     FILE * pFile;                    //File pointer     long lSize;                      //File size     size_t result;                        // Open file     pFile = fopen ( filename , "rb" );     if (pFile==NULL) return ERROR_OPEN_FILE;     // obtain file size:     fseek (pFile , 0 , SEEK_END);     lSize = ftell (pFile);     rewind (pFile);     // allocate memory to contain the whole file:     content = (char*) malloc (sizeof(char)*lSize);     if (content == NULL) return ERROR_MEMORY;     // copy the file into the buffer:     result = fread (content,1,lSize,pFile);     if (result != lSize) return ERROR_SIZE;     // terminate     fclose (pFile);     //allocate memory to contain the whole file + HEADER     buffer = (char*) malloc (sizeof(char)*lSize + 2048);     //print header     sprintf(hdrs,"Content-Type: multipart/form-data; boundary=%s",boundary);     sprintf(buffer,"--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n",boundary,nameForm,filename);     sprintf(buffer,"%sContent-Type: %s\r\n\r\n",buffer,type);     sprintf(buffer,"%s%s\r\n",buffer,content);     sprintf(buffer,"%s--%s--\r\n",buffer,boundary);     //Open internet connection     HINTERNET hSession = InternetOpen("WinSock",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);     if(hSession==NULL) return ERROR_INTERNET_OPEN;     HINTERNET hConnect = InternetConnect(hSession, iaddr,INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);     if(hConnect==NULL) return ERROR_INTERNET_CONN;     HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",url, NULL, NULL, (const char**)"*/*\0", 0, 1);     if(hRequest==NULL) return ERROR_INTERNET_REQ;     BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer));     if(!sent) return ERROR_INTERNET_SEND;     //close any valid internet-handles     InternetCloseHandle(hSession);     InternetCloseHandle(hConnect);     InternetCloseHandle(hRequest);     return 0;  }
登录后复制

这应该是把文件以二进制形式传给test.php吧。那么在test.php那边怎么接收这个二进制,并写入mysql数据库的某个字段呢?

它可以和别的整型数及字串在同一次post中提交吗?

这应该是把文件以二进制形式传给test.php吧。那么在test.php那边怎么接收这个二进制,并写入mysql数据库的某个字段呢?


要看对应的php是如何处理的。然后你发送对应格式的数据


这应该是把文件以二进制形式传给test.php吧。那么在test.php那边怎么接收这个二进制,并写入mysql数据库的某个字段呢?


要看对应的php是如何处理的。然后你发送对应格式的数据

对应PHP文件是用$bian_liang_ming = $_REQUEST['xxxx'];
来获取传过去的参数的。这种情况如何传递二进制数据流啊?

你是玩C的,你应该清楚的知道字符串是依靠尾部附加的 '\0' 来判断结束的,那你如何能保证图片数据中不出现'\0' 而导致字符串提前结束呢?

你是玩C的,你应该清楚的知道字符串是依靠尾部附加的 '\0' 来判断结束的,那你如何能保证图片数据中不出现'\0' 而导致字符串提前结束呢?


我其实并不知道确切该怎么做,所以随便套用了之前传递整型数的办法,知道是不对的。

c++ 应用 curl 库函数实现,这样少了协议的处理,事情变得单纯了
也可以用 sock 库函数实现
你 #3 的代码就是 sock 应用的一个例子

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

酷狗上传自己的音乐的简单步骤 酷狗上传自己的音乐的简单步骤 Mar 25, 2024 pm 10:56 PM

1、打开酷狗音乐,点击个人头像。2、点击右上角设置的图标。3、点击【上传音乐作品】。4、点击【上传作品】。5、选择歌曲,然后点击【下一步】。6、最后点击【上传】即可。

如何在QQ音乐上传歌词 如何在QQ音乐上传歌词 Feb 23, 2024 pm 11:45 PM

随着数字化时代的到来,音乐平台成为人们获取音乐的主要途径之一。然而,有时候我们在听歌的时候,发现没有歌词是一件十分困扰的事情。很多人都希望在听歌的时候能够显示歌词,以便更好地理解歌曲的内容和情感。而QQ音乐作为国内最大的音乐平台之一,也为用户提供了上传歌词的功能,使得用户可以更好地享受音乐的同时,感受到歌曲的内涵。下面将介绍一下在QQ音乐上如何上传歌词。首先

理解网页重定向的常见应用场景并了解HTTP301状态码 理解网页重定向的常见应用场景并了解HTTP301状态码 Feb 18, 2024 pm 08:41 PM

掌握HTTP301状态码的含义:网页重定向的常见应用场景随着互联网的迅猛发展,人们对网页交互的要求也越来越高。在网页设计领域,网页重定向是一种常见且重要的技术,通过HTTP301状态码来实现。本文将探讨HTTP301状态码的含义以及在网页重定向中的常见应用场景。HTTP301状态码是指永久重定向(PermanentRedirect)。当服务器接收到客户端发

如何提升电脑上传速度 如何提升电脑上传速度 Jan 15, 2024 pm 06:51 PM

上传速度变得非常慢?相信这是很多朋友用电脑上传东西时候都会遇到的一个问题,在使用电脑传送文件的时候如果遇到网络不稳定,上传的速度就会很慢,那么应该怎么提高网络上传速度呢?下面,小编将电脑上传速度慢的处理方法告诉大家。说到网络速度,我们都知道打开网页的速度,下载速度,其实还有一个上传速度也非常关键,特别是一些用户经常需要上传文件到网盘的,那么上传速度快无疑会给你省下不少时间,那么上传速度慢怎么办?下面,小编给大伙带来了电脑上传速度慢的处理图文。电脑上传速度慢怎么解决点击“开始--运行”或者“窗口键

二进制算法怎么算 二进制算法怎么算 Jan 19, 2024 pm 04:38 PM

二进制算法是一种基于二进制数的运算方法,其基本运算包括加法、减法、乘法和除法。除了基本运算外,二进制算法还包括逻辑运算、位移运算等操作。逻辑运算包括与、或、非等操作,位移运算包括左移和右移操作。这些操作都有对应的规则和操作数的要求。

电脑怎么拍照上传 电脑怎么拍照上传 Jan 16, 2024 am 10:45 AM

电脑只要安装了摄像头就可以进行拍照,但是有些用户还不知道该怎么拍照上传,现在就给大家具体介绍一下电脑拍照的方法,这样用户得到图片之后想上传到哪里都可以了。电脑怎么拍照上传一、Mac电脑1、打开访达,再点击左边的应用程序。2、打开后点击相机应用。3、点击下方的拍照按钮就可以了。二、Windows电脑1、打开下方搜索框,输入相机。2、接着打开搜索到的应用。3、再点击旁边的拍照按钮就可以了。

http请求415错误解决方法 http请求415错误解决方法 Nov 14, 2023 am 10:49 AM

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。

HTTP 200 OK:了解成功响应的含义与用途 HTTP 200 OK:了解成功响应的含义与用途 Dec 26, 2023 am 10:25 AM

HTTP状态码200:探索成功响应的含义与用途HTTP状态码是用来表示服务器响应状态的数字代码。其中,状态码200表示请求已成功被服务器处理。本文将探索HTTP状态码200的具体含义与用途。首先,让我们了解一下HTTP状态码的分类。状态码被分为五个类别,分别是1xx、2xx、3xx、4xx和5xx。其中,2xx表示成功的响应。而200是2xx中最常见的状态码

See all articles