vc++上传文件
来源:互联网 发布:淘宝网不是私密连接 编辑:程序博客网 时间:2024/06/05 16:53
//获取文件内容
bool file_con(char **buffer,LPCSTR file)
{
FILE *fp = fopen(file, "rb");
if(fp==NULL)
{
printf("文件上传失败,请检查文件路径.....\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;
}
//文件上传
std::string upload(LPCSTR lpszServer,LPCSTR lpszAddr,LPCSTR fileUrl)
{
char *file = NULL;
if(!file_con(&file,fileUrl))
{
return "0";
}
SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
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);
return "0";
}
printf("ip address = %s, port = %d\n",inet_ntoa(server.sin_addr), ntohs(server.sin_port));
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/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\r\n";
header += "Connection: Keep-Alive\r\n";
header += "Accept: text/html, application/xhtml+xml, */*\r\n";
header += "Referer: http://www.xxx.com/form/submit.php?name=uninstall\r\n";
header += "Accept-Language: zh-CN\r\n";
header += "Pragma: no-cache\r\n";
header += "Proxy-Connection: Keep-Alive\r\n";
header += "Content-Type: multipart/form-data;boundary=----------------------------64b23e4066e5d\r\n";
content += "------------------------------64b23e4066e5d\r\n";
content += "Content-Disposition: form-data; name=\"field#[file][]\"; filename=\"1.jpg\"\r\n";
content += "Content-Type: image/jpeg\r\n";
//post尾时间戳
std::string strContent("\r\n------------------------------64b23e4066e5d--\r\n");
char temp[64] = {0};
//注意下面这个参数Content-Length,这个参数值是:http请求头长度+请求尾长度+文件总长度
sprintf(temp, "Content-Length: %d\r\n\r\n", content.length()+l_file_len+strContent.length());
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.2);
}
::send(sock,strContent.c_str(),strContent.length(),0);
char szBuffer[10240] = {0};
while (true)
{
int nRet = ::recv(sock, szBuffer, sizeof(szBuffer), 0);
if (nRet == 0 || nRet == WSAECONNRESET)
{
printf("Connection Closed.\n");
break;
}
else if (nRet == SOCKET_ERROR)
{
printf("socket error\n");
break;
}
else
{
printf("recv() returned %d bytes\n", nRet);
printf("received: %s\n", szBuffer);
break;
}
}
::closesocket(sock);
delete [] file;
return szBuffer;
}
void main()
{
WORD wVersionRequested=MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(wVersionRequested,&wsaData))
{
cout<<"加载错误"<<endl;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wHighVersion)!=2)
{
cout<<"WinSock's 加载错误"<<endl;
}
upload("www.xxx.com","/form/submit.php?name=uninstall","C:\\Users\\Administrator\\Desktop\\1.jpg");
return ;
}
curl:上传文件
curl_global_init(CURL_GLOBAL_WIN32);
CURL*easy_handle = curl_easy_init();
// 使用multi-parts form post
curl_easy_setopt(easy_handle, CURLOPT_URL,"http://wvw.xxx.com/form/submit.php?name=uninstall");
curl_httppost*post = NULL; curl_httppost *last =NULL;
// 文本数据
//curl_formadd(&post,&last, CURLFORM_COPYNAME, "id",CURLFORM_COPYCONTENTS, "JGood",CURLFORM_END);
//curl_formadd(&post,&last, CURLFORM_COPYNAME, "forward",CURLFORM_COPYCONTENTS, "HangZhou", CURLFORM_END);
//curl_formadd(&post,&last, CURLFORM_COPYNAME, "field#[test]",CURLFORM_COPYCONTENTS, "te", CURLFORM_END);
//curl_formadd(&post,&last, CURLFORM_COPYNAME, "field#[file][]",CURLFORM_COPYCONTENTS, "te", CURLFORM_END);
// 文本文件中的数据
curl_formadd(&post,&last, CURLFORM_COPYNAME, "field#[file][]",CURLFORM_FILE, "1.jpg", CURLFORM_CONTENTTYPE, "image/jpeg",CURLFORM_END);
curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST,post);
curl_easy_perform(easy_handle);
curl_formfree(post);
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
- vc++上传文件
- VC实现http上传文件
- vc++ post http实现文件上传
- VC实现上传文件到FTP服务器
- VC FTP上传文件 简单实现
- vc的ftp编程,得到文件,上传文件
- VC实现FTP定时上传文件的实现
- vc中如何通过http的post方式上传文件
- windows基于阿帕奇+PHP服务器,实现vc++文件上传功能
- VC 局域网内上传文件 FTP或盘符映射
- VC++ 用WinInet发送HTTP请求和上传文件
- 文件上传---文件上传
- VC文件
- VC:利用Curl库实现文件上传及速度很慢问题
- vc 利用http 上传文件到web 的请求头内容
- 上传文件
- 文件上传
- 上传文件
- 2017西安交大ACM小学期数据结构 [线段树]
- BZOJ-2733 永无乡 合并线段树 并查集
- JAVA 比较两个日期相差的天数
- 锁,同步,可重入锁,读写锁
- 2017.7.3 SPFA SLF优化
- vc++上传文件
- C++中#include<XXX.h>和#include"XXX.h"的区别
- 理解Rabbitmq消息通信
- 对配置文件的认识
- 小白如何使用Android Studio把自己的Android library分享到jCenter
- 判断网络质量好坏的加权公式
- StringUtil.isEmpty()和StringUtil.isBlank()的区别
- 分布式锁的几种实现方式
- redis反序列化session报错