设为首页 加入收藏

TOP

VC++ Post 方法 上传数据到web服务器(一)
2017-10-11 18:33:33 】 浏览:8233
Tags:Post 方法 上传 数据 web 服务器

最近在做一个项目,需要与WEB服务器交互一些信息。其中一项就是文件的上传与下载。现来一个上传的代码

#include "stdio.h"    
#include "WinSock2.h"    
#include "iostream"    
using namespace std;    
#pragma comment(lib,"ws2_32.lib")    
long l_file_len;    
//获取文件内容    
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/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=----------------------------64b23e4066ed\r\n";    
    
    content += "------------------------------64b23e4066ed\r\n";       
    content += "Content-Disposition: form-data; name=\"file\"; filename=\"大论文和实验材料.rar\"\r\n";       
    content += "Content-Type: aapplication/octet-stream\r\n\r\n";       
    
    //post尾时间戳    
    std::string strContent("\r\n------------------------------64b23e4066ed\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 = nPac
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Queue的push和front操作 下一篇FatMouse的交易问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目