一个http upload问题

    技术2022-05-11  113

    求教http upload问题

    huananshi

    2005-12-01, 11:23

    我原来在GetNextDataPart直接把想要传的数据uploadaDataPart.set(/*整个数据*/)没有出现任何问题,我现在想把文件分成n块传送,块长度为1kTBool 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();elsereturn 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);DescriptionNotifies 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 的帮忙,论坛需要你这样的热心人,非常感谢:)

      


    最新回复(0)