发新帖

[C/VC/C++] post 上传文件

零下一度 2019-9-11 1167
long l_file_len;

//获取文件内容
bool file_con(char **buffer, LPCSTR file) {
	 
	FILE *fp = fopen(file, "rb");
	if (fp == NULL)
	{
		std::wcout << "请检查文件路径.....\n";
		return false;
	}
	fseek(fp, 0, SEEK_END);
	l_file_len = ftell(fp);
	rewind(fp);
 
	*buffer = new char[l_file_len + 1];
	memset(*buffer, 0, l_file_len + 1);
	fseek(fp, 0, SEEK_SET);
	fread(*buffer, sizeof(char), l_file_len, fp);
	fclose(fp);
	return true;
}

//文件上传
/**
lpszServer:服务器地址
lpszAddr:服务器接受文件地址
fileUrl:文件存放目录
filename:文件名称带扩展名的
*/
std::string upload(LPCSTR lpszServer, LPCSTR lpszAddr, LPCSTR fileUrl,string filename) {
	char *file = NULL;
	if (!file_con(&file, fileUrl))
	{
		return "0";
	}
	 
	WORD wVersionRequested;
	WSAData wsaData;
	int err;
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		printf("WSAStartup() called failed!\n");
		Sleep(5);
		return 0;
	}
	else
	{
		printf("WSAStartup() called successful!\n");
	}
	if (LOBYTE(wsaData.wVersion) != 2 ||
		HIBYTE(wsaData.wVersion) != 2) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		WSACleanup(); 
		Sleep(5);
		return "0";
	} 
	 
	SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	 
	if (sock == INVALID_SOCKET) {
		printf("connect() called failed! The error code is: %d\n", WSAGetLastError());
		Sleep(5);
		return "0";
	}
	 
	SOCKADDR_IN server;
	server.sin_family = AF_INET;
	server.sin_port = htons(80);
	struct hostent *host_addr = gethostbyname(lpszServer);
	if (host_addr == NULL) {
		return "host_addr == NULL";
	}
	server.sin_addr.s_addr = *((int *)*host_addr->h_addr_list);
	if (::connect(sock, (SOCKADDR *)&server, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
	{
		::closesocket(sock);
		Sleep(5);
		return "0";
	}
	 
	//printf("ip address = %s, port = %d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port));  
	CTime currTime;
	currTime = CTime::GetCurrentTime(); 
	CString dateformat;
	dateformat.Format(_T("%u"), currTime.GetTime());
	std::string dateCurrent = dateformat.GetBuffer(0);
	std::string header("");
	std::string content("");
	//----------------------post头开始--------------------------------    
	header += "post ";
	header += lpszAddr;
	header += " HTTP/1.1\r\n";
	header += "Host: ";
	header += lpszServer;
	header += "\r\n";
	header += "User-Agent: Mozilla/4.0\r\n";
	header += "Connection: Keep-Alive\r\n";
	header += "Accept: */*\r\n";
	header += "Pragma: no-cache\r\n";
	header += "Content-Type: multipart/form-data; charset=\"gb2312\"; boundary=----------------------------"+ dateCurrent +"\r\n";
	content += "------------------------------"+ dateCurrent +"\r\n";
	content += "Content-Disposition: form-data; name=\"file\"; filename=\""+ filename +"\"\r\n";
	content += "Content-Type: aapplication/octet-stream\r\n\r\n";
	//post尾时间戳    
	std::string strContent("\r\n------------------------------"+ dateCurrent +"\r\n");
	char temp[64] = { 0 };
	//注意下面这个参数Content-Length,这个参数值是:http请求头长度+请求尾长度+文件总长度    
	sprintf(temp, "Content-Length: %d\r\n\r\n", content.length() + l_file_len);
	header += temp;
	 
	std::string str_http_request;
	str_http_request.append(header).append(content); 
	//----------------------post头结束-----------------------------------    
	//发送post头    
	send(sock, str_http_request.c_str(), str_http_request.length(), 0);
	char fBuff[4096];
	int nPacketBufferSize = 4096; // 每个数据包存放文件的buffer大小    
	int nStart;//记录post初始位置    
	int nSize;//记录剩余文件大小    
	// 就分块传送    
	for (int i = 0; i < l_file_len; i += nPacketBufferSize)
	{
		nStart = i;
		if (i + nPacketBufferSize + 1 > l_file_len)
		{
			nSize = l_file_len - i;
		}
		else
		{
			nSize = nPacketBufferSize;
		}
		memcpy(fBuff, file + nStart, nSize);
		::send(sock, fBuff, nSize, 0);
		Sleep(0.5);
	}
	//::send(sock, strContent.c_str(), strContent.length(), 0);
	char szBuffer[1024] = { 0 };
	while (true)
	{
		int nRet = ::recv(sock, szBuffer, sizeof(szBuffer), 0);
		  
		if (nRet == 0 || nRet == WSAECONNRESET)
		{
			std::wcout << "Connection Closed.\n";
			break;
		}
		else if (nRet == SOCKET_ERROR)
		{ 
			std::wcout << "socket error\n";
			break;
		}
		else
		{
			//char Information_nRet[256];
			//char Information_szBuffer[256];
			
			//sprintf(Information_nRet, "recv() returned %d bytes\n", nRet); 
			//std::wcout << Information_nRet; 
			//sprintf(Information_szBuffer,"received: %s\n", szBuffer);
			//std::wcout << Information_szBuffer;
			 
			break;
		}
	}
	::closesocket(sock);
	delete[] file;
	return "0";
	//return szBuffer;
}

int main(){
    
    char temp_path[300];
    string res_notice = upload("域名", "/interface/.", temp_path, '123.txt');

}


最新回复 (0)
返回
零下一度
主题数
928
帖子数
0
注册排名
1