一个http upload问题

求教http upload问题

huananshi

2005-12-01, 11:23

我原来在GetNextDataPart直接把想要传的数据upload
aDataPart.set(/*
整个数据*/)

没有出现任何问题,

我现在想把文件分成n块传送,块长度为1k
TBool CHttpEngine::GetNextDataPart(TPtrC8& aDataPart)
{
TInt iLen = iPostData->Length() - iDataChunkCount * 1024;
if(iLen > 1024)
iReqBodySubmitBufferPtr = iPostData->Mid(iDataChunkCount * 1024, 1024) ;
else if(iLen>=0 )
iReqBodySubmitBufferPtr = iPostData->Mid(iDataChunkCount * 1024, iLen) ;

aDataPart.Set(iReqBodySubmitBufferPtr);
++iDataChunkCount;

return !(iLen - 1024 >0) ;
}
void CHttpEngine::ReleaseData()
{
TPtr8 buff = iReqBodySubmitBuffer->Des();
buff.Zero();
TRAPD(err, iTransaction.NotifyNewRequestBodyPartL());
}
TInt CHttpEngine::OverallDataSize()
{
if(iPostData)
return iPostData->Length();
else
return KErrNotFound ;
}

这三个函数我都重载了,可为什么发完最后的包,执行并没有按预期的那样接收到消息并跳到
void CHttpEngine::MHFRunL(RHTTPTransaction aTransaction,
const THTTPEvent& aEvent)

而是直接非法关闭了,我用一个1577byte长度的文件测试,执行了两次 getnextdatapart,每步我都仔细看过,并没发现任何错误, 知道这是什么问题?我还对比了例子HTTPEXAMPLECLIENT ,也没找到原因,谢谢各位了!

beover1984

2005-12-02, 02:17

检查一下GetNextDataPart(TPtrC8& aDataPart)的返回值是不是对你的程序逻辑有影响,然后你再发一个1024大小的文件试试.

huananshi

2005-12-02, 02:27

不好意思,我没理解您的意思,GetNextDataPart不是s60自己调用的么,什么情况下会对我程序的逻辑有影响?我发的数据包括http的一些信息,总共是1577,如果只发一个文件为1024的不行吧?您的意思是不是说加上包头信息总共是1024个字节的大小?

beover1984

2005-12-02, 03:50

void CHttpEngine::ReleaseData()
{
TPtr8 buff = iReqBodySubmitBuffer->Des();
buff.Zero();
TRAPD(err, iTransaction.NotifyNewRequestBodyPartL());
if (err != KErrNone) //
加上这句判断err的值是什么
{
//
出错处理
}
}

huananshi

2005-12-02, 04:12

始终是0,稍等,我正用小于1024的文件测试,出现正常上传和非法两种情况了,哈,离胜利近了一步:)

huananshi

2005-12-02, 04:27

晕!!小于1024的文件,如果在ReleaseData()函数中不调用iTransaction.NotifyNewRequestBodyPartL()执行就没问题,一调用这个函数肯定出错,
而我的err 始终= 0 没错。。。。。我分块的数据有问题么?我的理解是就把整个包当成一个数据buffer,况且一个1024以下的数据,一次传过去怎么也会出错呢???

huananshi

2005-12-02, 04:49

应该不是我代码里的错误吧??出错的时候我看了call stack,并没有我的代码,我觉得倒象是崩在s60的某个lib里,所有相关的代码我都下断点了,并没有一个断下来的,应该是s60内部处理的一个错误....我搞s60的过程中多次遇到这种死到s60里的情况,每次遇到这种问题,都没办法解决,也不知道问题出在什么地方,最后就只能换种方式了....难道s60的调试查错能力就只有这种程度啊? 但是这回我这个分块的功能却没有别的办法绕开,只能把这个bug找出来,没有别的办法了么?今天可周末了啊,屁股没开净,周末会过的很难受的:(

huananshi

2005-12-02, 05:20

哈哈,解决了!!问题找到了!!!
NotifyNewRequestBodyPartL()
void NotifyNewRequestBodyPartL(THTTPFilterHandle aStart=THTTPFilterHandle::EClient);
Description
Notifies the framework of the availability of more request body data.

This is used when submitting body data in several parts.

其实函数说明说的也算清楚,当还有数据没传完的时候才调用此函数,所以说,当getnextdatapart函数最后一步返回true的时候ReleaseData()就不应该再调用NotifyNewRequestBodyPartL()!可是最可气的是,httpexample本身就是错的,竟然没有此判断!!!!误导我一直再怀疑是不是自己的代码有内存泄漏,或是NotifyNewRequestBodyPartL的默认参数是否需要修改...还好算是解决了,谢谢beover1984 的帮忙,论坛需要你这样的热心人,非常感谢:)

  

你可能感兴趣的:(一个http upload问题)