利用HTTP方式上传-windows编程

#include <afxdtctl.h>
#include <Windows.h>
#include <WinINet.h>
#include <stdio.h>
BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize,CString strLocalFile);
BOOL Upload(CString bstrLocalFile,CString bstrServerIP,CString strServerPort,CString bstrRemoteFile);
#define BUFFSIZE 500

void main( int argc, char **argv )
{

    if (argc < 5)
    {
        printf("Usage: Bigpost <LocalFile> <ServerIP><ServerPort><ReomteFile>/n");
        printf("<LocalFile> is the local file to POST/n");
        printf("<ServerIP> is the server's IP to POST to/n");
        printf("<ServerPort> is the server's Port to POST to/n");
        printf("<ReomteFile> is the virtual path to POST to/n");
        exit(0);
    }
    Upload(argv[1],argv[2],argv[3],argv[4]);
}
BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize,CString strLocalFile)
{
    DWORD dwRead;
    BYTE* buffer;
    printf("Local file:%s/n",strLocalFile);
    FILE* fLocal;
    if((fLocal=fopen(strLocalFile,"rb"))==NULL){
        printf("Can't open the file:%s,maybe it doesn't exist!/n",strLocalFile);
            return false;
    }
    fseek(fLocal,0L,SEEK_END);
    dwRead=ftell(fLocal);
    rewind(fLocal);
        buffer=(BYTE *)malloc(dwRead);
        if(!buffer){
            printf("not enough memory!/n");
            return false;
        }
        printf("length of file:%d/n",dwRead);
        dwRead=fread(buffer,1,dwRead,fLocal);
        dwPostSize=dwRead;

    INTERNET_BUFFERS BufferIn;
    DWORD dwBytesWritten;
    BOOL bRet;
    BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur
    BufferIn.Next = NULL;
    BufferIn.lpcszHeader = NULL;
    BufferIn.dwHeadersLength = 0;
    BufferIn.dwHeadersTotal = 0;
    BufferIn.lpvBuffer = NULL;               
    BufferIn.dwBufferLength = 0;
    BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize
    BufferIn.dwOffsetLow = 0;
    BufferIn.dwOffsetHigh = 0;

    if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0))
    {
        printf( "Error on HttpSendRequestEx %d/n",GetLastError() );
        return FALSE;
    }
    bRet=TRUE;
        if(bRet=InternetWriteFile( hRequest, buffer, dwPostSize, &dwBytesWritten))
            printf( "/r%d bytes sent.", dwPostSize);
    if(!bRet)
    {
        printf( "/nError on InternetWriteFile %lu/n",GetLastError() );
        return FALSE;
    }

    if(!HttpEndRequest(hRequest, NULL, 0, 0))
    {
        printf( "Error on HttpEndRequest %lu /n", GetLastError());
        return FALSE;
    }
        fclose(fLocal);
    free(buffer);
    return TRUE;
}

BOOL Upload(CString strLocalFile,CString strServerIP,CString strServerPort,CString strRemoteFile){
    DWORD dwPostSize=0;
    int intServerPort=atoi(strServerPort);
    HINTERNET hSession = InternetOpen( "HttpSendRequestEx", INTERNET_OPEN_TYPE_PRECONFIG,
        NULL, NULL, 0);
    if(!hSession)
    {
        printf("Failed to open session/n");
        return FALSE;
    }
    HINTERNET hConnect = InternetConnect(hSession, strServerIP, intServerPort,
        NULL, NULL, INTERNET_SERVICE_HTTP,NULL, NULL);
    if (!hConnect){
        printf( "Failed to connect/n" );
        return FALSE;
    }else{
        HINTERNET hRequest = HttpOpenRequest(hConnect, "PUT", strRemoteFile,
            NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
        if (!hRequest){
            printf( "Failed to open request handle/n" );
        }else{
            if(UseHttpSendReqEx(hRequest, dwPostSize,strLocalFile))
            {   
                char pcBuffer[BUFFSIZE];
                DWORD dwBytesRead;

                printf("/nThe following was returned by the server:/n");
                do
                {    dwBytesRead=0;
                    if(InternetReadFile(hRequest, pcBuffer, BUFFSIZE-1, &dwBytesRead))
                    {
                        pcBuffer[dwBytesRead]=0x00; // Null-terminate buffer
                        printf("%s", pcBuffer);
                    }
                    else
                        printf("/nInternetReadFile failed");
                }while(dwBytesRead>0);
                printf("/n");
            }
            if (!InternetCloseHandle(hRequest))
                printf( "Failed to close Request handle/n" );
        }
        if(!InternetCloseHandle(hConnect))
            printf("Failed to close Connect handle/n");
    }
    if( InternetCloseHandle( hSession ) == FALSE ){
        printf( "Failed to close Session handle/n" );
        return FALSE;
    }
    printf( "/nFinished./n" );
    return TRUE;
}

此示例演示在 Internet Explorer 4.0 WinInet.dll 中引入并记录在 Internet 客户端 SDK 中的 HttpSendRequestEx 函数的正确用法。 原始的 HttpSendRequest 函数有这样一个重大限制: 所有请求的数据都有一个缓冲区时调用该函数时将提供。这是通常不方便、 导致在某些客户端应用程序中,性能较差,可能会无法上载大量数据从客户端计算机使用有限的内存。新的 HttpSendRequestEx 函数允许启动请求,发送出数据分小段为可用,然后结束后已发送的所有数据的请求的程序。为了使此函数以处理计算机上必须安装 Internet Explorer 4.0。下列文件已可从 Microsoft 下载中心下载: Hsrex.exe 有关如何下载 Microsoft 支持文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 119591 如何从在线服务获得 Microsoft 支持文件微软已对此文件进行病毒扫描。Microsoft 使用该文件投递日期时可用的最新的病毒检测软件。该文件存储在安全增强型服务器上,以防止对文件进行任何未经授权的更改。 Hsrex.exe 是自解压的存档文件,其中包含 BigPost.cpp (演示程序代码) 和 Readall.asp,一个 Active Server Pages (ASP) 脚本将读取所有发送 POST 请求中的数据。Readall.asp 是 BigPost,可以使用 Microsoft 互联网信息服务器 (IIS) 版本的支持 ASP 作为示例目标提供。对于其他 Web 服务器,您需要提供相应的服务器脚本来读取数据。 若要编译此程序包含在 Microsoft Visual C++ 5.0,请执行以下步骤: 1.运行 Visual C++ 和创建一个新的 Win32 控制台应用程序调用"BigPost"。 2.在目录中创建项目的位置,运行 Hsrex.exe。 3.将 BigPost.cpp 添加到 BigPost 项目。 4.转到项目设置对话框中,单击链接选项卡,然后添加到 WinInet.lib"对象/库模块:"字段。 5.请确保配置 Visual C++,以便编译器和链接器将使用 Wininet.h 和 Wininet.lib 从 Internet 客户端 SDK。如果未能做到这一点,将导致编译器或链接器错误。原型和 HttpSendRequestEx 的导出不包含 Visual C++ 中包含的包括和库文件。 6.生成项目。它将创建 BigPost.exe。 在程序运行,如下所示: BigPost < 大小 >< 服务器 >< 路径 > 例如,以下将开机自检 1 兆字节 (1024 KB) 到 http://yourserver/scripts/ReadAll.asp: 您的服务器 /scripts/ReadAll.asp BigPost 1024
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值