admin 管理员组

文章数量: 1086019


2024年4月25日发(作者:python入门100题)

文件上传到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 =

pConnection(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=pConnection(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;

ctSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur


本文标签: 文件 需要 字节数