文件上传到HTTP服务器

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文件上传到HTTP服务器

2011-03-14 17:15

最近两个星期主要搞这个东东,到今天总算比较圆满的搞定了. 用http协议上传主要有两种形式: 第一是用http的put协议,第二是用http的post协议.

先说说put协议, 所谓put,顾名思义,就是把文件"放"到server端. 这个过程不涉及文件的http和mime封装(post协议需要做), 因而比较简单.但是考虑到安全问题,一般服务器不会开发put权限,因此这种方法的用途并不广泛

废话不多说,来看看代码:

CInternetSession internetSession("my session"); //定义session

CHttpConnection* httpConnection = internetSession.GetHttpConnection(strServerIP,intServerPort); //获得链接CHttpFile* httpFile = httpConnection->OpenRequest(CHttpConnection::HTTP_VERB_PUT,strRemoteFile,NULL,0,NULL, NULL,INTERNET_FLAG_DONT_CACHE); //发送请求

...

httpFile->SendRequestEx(&BufferIn,NULL,HSR_INITIATE,0);

注意倒数第二句的CHttpConnection::HTTP_VERB_PUT, 表示程序将采用http的put协议上传文件.

再看post协议,这个东东如果只涉及文本还是比较简单的,可以直接post过去,不用构造表单. 但是一旦需要上传文件, 就需要用http和mime的两层封装了. 封装需要对http头和mime标识做一些了解,很恶心=,=. 最需要注意的一点, 在最后SendRequestEx的时候, 传递的参数是文件的字节数,这个字节数应该是所要上传的文件和http头以及mime头的字节总数! 否则即使CLIENT端不出错, server也得不到正确结果的!

也来看看代码吧:

CInternetSession internetSession("my session"); //定义session

CHttpConnection* httpConnection=internetSession.GetHttpConnection(strServerIP,intServerPort); //获得链接

CHttpFile* httpFile = httpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,strRemoteFile,NULL,0,NULL, NULL,INTERNET_FLAG_DONT_CACHE); //发送请求

...

httpFile->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);

随便说说,post协议俺用baidu搜了许久,找到了一个类似的程序,研究了许久搞不定.. 后来目有办法, google一个外文论坛, 拜读了某牛人的大作后,终于弄清楚了~ 看来以后还是要多啃鸟文啊..

附上源代码:

put协议:

UpLoadFile::UpLoadFile(void)

{

}

UpLoadFile::~UpLoadFile(void)

{

}

BOOL UpLoadFile::UseHttpSendReqEx(CHttpFile* httpFile, DWORD dwPostSize,CString strLocalFile)

{

try

{

DWORD dwRead,dwRet;

BYTE* buffer;

TRACE("Local file:%sn",strLocalFile);

FILE* fLocal;

if((fLocal=fopen(strLocalFile,"rb"))==NULL)

{

TRACE("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){

TRACE("not enough memory!n");

return false;

}

TRACE("length of file:%dn",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;

httpFile->SendRequestEx(&BufferIn,NULL,HSR_INITIATE,0);

//httpFile->SendRequestEx(dwPostSize);

httpFile->Write( buffer, dwPostSize);

if(!httpFile->EndRequest(0,0,0))

{

TRACE( "Error on HttpEndRequest %lu n", GetLastError());

return FALSE;

}

fclose(fLocal);

free(buffer);

return TRUE;

}

catch (CInternetException* pEx)

{

//catch errors from WinInet

}

return FALSE;

}

BOOL UpLoadFile::Upload(CString strLocalFile,CString strServerIP,CString strServerPort,CString strRemoteFile)

{

try

{

DWORD dwPostSize=0;

INTERNET_PORT intServerPort=atoi(strServerPort);

CInternetSession internetSession("my session");

相关文档
最新文档