跪求关于HTTP下载的相关提示,GetNextDaraPart()实现

luolibin100 2007-02-13 09:17:17
我有个关于HTTP下载的问题,我看了SDK里面的HTTPEXAMPLE例子,里面的GetNextDataPart函数的实现让我很搞不明白,它好像只是从本地文件读到缓冲区,也就是只有上传功能,不知道它的下载功能是怎么实现的啊?
要是我要实现下载,这个GetNextDataPart函数该怎么写啊?给我点提示好吗?非常感谢!!
附SDK该函数实现代码:
TBool CHttpClient::GetNextDataPart(TPtrC8& aDataPart)
{
__ASSERT_DEBUG(iReqBodySubmitBuffer, User::Panic(KHttpExampleClientPanic, EReqBodySumitBufferNotAllocated));
// Read from the request body file
TBool retVal = EFalse;
TInt err = iReqBodyFile.Read(iReqBodySubmitBufferPtr);
if (err == KErrNone)
{
aDataPart.Set(iReqBodySubmitBufferPtr);
++iDataChunkCount;
retVal = (iReqBodySubmitBufferPtr.Length() == 0);
}
return retVal;
}
...全文
495 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjc8279 2008-06-26
  • 打赏
  • 举报
回复
下载不需要GetNextDataPart函数,而是直接在ResponseBodyData中获取数据即可
yanro 2008-06-22
  • 打赏
  • 举报
回复
case THTTPEvent::EGotResponseBodyData:
{
MHTTPDataSupplier* body = aTransaction.Response().Body ();
TPtrC8 dataChunk;

TBool isLast = body->GetNextDataPart (dataChunk);

TBuf<KInfotextBufferSize> text;
_LIT(KBodyPartReceived, "%d bytes received... ");
text.Format (KBodyPartReceived, dataChunk.Length ());

BodyReceived (dataChunk);

if (iErrorFlag)
{
return;
}

if ( isLast)
{
_LIT(KBodyReceived,"Body received");
}

body->ReleaseData ();

}
break;




TBool CHttpClientEngine::GetNextDataPart(TPtrC8& aDataPart)
{
if ( iPostData)
{
aDataPart.Set (iPostData->Des ());
}
return ETrue;
}
goodwade 2008-06-20
  • 打赏
  • 举报
回复
http://wiki.forum.nokia.com/index.php/Symbian_C++_:_Multipart/form-data
goodwade 2008-06-20
  • 打赏
  • 举报
回复
LZ意思应是 HTTP下载时GetNextDataPart()要重写吗?要的话怎样实现?
SDK的例子提供了上传时的重写。
GetNextDataPart的调用机制?
flygh123 2008-06-19
  • 打赏
  • 举报
回复
这是两个不同的函数,调用机制也不同,而在处理上行Post数据时,就要求自定义的类需要实现MHTTPDataSupplier接口,GetNextDataPart是接口里面的一个函数,用与客户端写入上行数据,这个函数需要自己实现,系统在上传完成当前数据部分时就会调用该函数用来取得自己需要上传数据的下一部分,并且传给发送RTransaction是否是最后需要上传的数据块来表明上传完成, 其中的参数TPtrC8 &aDataPart 就是你当前需要上传的数据!注意这个函数是系统调用的!


下载数据时,这个函数用来取得HTTP请求响应里面的数据文件的,用户在HTTP响应事件 EGotResponseBodyData里面用户自己调用,并且提示用户该数据块是否是响应数据的最后一部分,用户通过这个函数来对下载的数据进行自己的处理!
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
不明LZ在说什么
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
八月之光 2008-04-22
  • 打赏
  • 举报
回复
可是我在模拟器上调试这个例子怎么显示system error(-1),这是什么原因,如何解决啊?
hanxiao_0210 2008-01-08
  • 打赏
  • 举报
回复
mark
saltedfish_zl 2007-07-17
  • 打赏
  • 举报
回复
本人也看到这个方法时有点迷糊。
仔细看后,细想来是否这样:
TBool GetNextDataPart(TPtrC8 &aDataPart)方法
在处理下行数据时,需要传入一个TPtrC8参数,用于http数据流往其中写入收到的数据。

而在处理上行Post数据时,就要求自定义的类需要实现MHTTPDataSupplier接口,这时候的GetNextDataPart就是用与客户端写入上行数据。其中的参数TPtrC8 &aDataPart就相当于是上行的输出流,类似于j2me中的conn.openOutputStream出来的这个outputstream.

所以个人理解aDataPart参数相当于是http上下行数据流的数据操作指针。
个人理解不知道是否正确,还请高手指教。谢谢。


saltedfish
dyw 2007-07-17
  • 打赏
  • 举报
回复
你列出的那个函数是用于上传文件的。Response的处理应在MHFRunL函数里。大概这样:
case THTTPEvent::EGotResponseBodyData:
{
MHTTPDataSupplier* body = aTransaction.Response().Body();

if (iSavingResponseBody)
{
TPtrC8 bodyData;
TBool lastChunk = body->GetNextDataPart(bodyData);
iRespBodyFile.Write(bodyData);
if (lastChunk)
{
//iRespBodyFile.Close();

// additional jobs here
}
}
else
{
// other non-file jobs here
}
body->ReleaseData();
}
break;

上面的iSavingResponseBody值可在THTTPEvent::EGotResponseHeaders事件中判断。
ig_scl 2007-02-13
  • 打赏
  • 举报
回复
按照标准的HTTP 协议就可以

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧