http download几个问题

luyiyuan129 2007-12-11 09:51:39
我要从Server上下载一文件,现在有几个问题没解决,如下:
1.这个文件只有Ansi和Utf8可以被识别,否则http返回404错误(别人说Unicode可以),而且文件后缀好象只能是".txt"
2.当这个文件是Ansi时,我直接下载不经任何转换,用RFile保存后的文件,有部分乱码(特别是"\")(这个文件的内容主要是一行行的目录,如“C:\system\apps”)
3.当这个文件是Ansi时,我用CnvUtfConverter::ConvertToUnicodeFromUtf8L转换保存后的文件,居然大小为0kb(期间无错误)
4.当这个文件是Unicode时,下载下来的文件是否不需要转换,即是Unicode?

3中的代码:
			MHTTPDataSupplier* body = aTransaction.Response().Body();
TPtrC8 dataChunk;


TBool isLast = body->GetNextDataPart(dataChunk);

HBufC* buf16=CnvUtfConverter::ConvertToUnicodeFromUtf8L(dataChunk);
CleanupStack::PushL(buf16);

HBufC8* buf8 = HBufC8::NewL(buf16->Length());
CleanupStack::PushL(buf8);

TPtrC8 ptr(buf8->Des());

RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);

RFile file;
TInt err=file.Open(fs, iFile, EFileWrite);
CleanupClosePushL(file);
if (err==KErrNotFound) // file does not exist - create it
{
err=file.Create(fs,iDuKuFile,EFileWrite);
}

TInt aPos=0;
file.Seek(ESeekCurrent, aPos);
file.Write(ptr); //save the file being downloaded
file.Close();
CleanupStack::PopAndDestroy(4);
...全文
517 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanxiao_0210 2008-01-10
  • 打赏
  • 举报
回复
学习……
luyiyuan129 2007-12-12
  • 打赏
  • 举报
回复
3.当这个文件是Utf8时,CnvUtfConverter::ConvertToUnicodeFromUtf8L也为0kb
我现在尝试用CCnvCharacterSetConverter转换,得到的也是0KB,晕,请帮忙看一下下面的代码,是不是哪边错了:
		MHTTPDataSupplier* body = aTransaction.Response().Body();
TPtrC8 dataChunk;

TBool isLast = body->GetNextDataPart(dataChunk);

//--------ansi转Unicode--------------
RFs fs;
User::LeaveIfError(fs.Connect());
CleanupClosePushL(fs);
CCnvCharacterSetConverter* converter=CCnvCharacterSetConverter::NewLC();
// Check if there is conversion between GBK/GB2312 and unicode
// if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGb2312,
if( converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,
fs) == CCnvCharacterSetConverter::EAvailable )
{
// Do nothing about it
}
else if ( converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGb2312,
fs)!= CCnvCharacterSetConverter::EAvailable )
{
CleanupStack::PopAndDestroy();
User::Leave( KErrNotSupported );
}
TInt state=CCnvCharacterSetConverter::KStateDefault;

HBufC* iInfoText = HBufC::NewL( dataChunk.Length() );
TPtr16 ptr16 = iInfoText->Des();

if( CCnvCharacterSetConverter::EErrorIllFormedInput ==
converter->ConvertToUnicode(ptr16, dataChunk, state ) )
{
CleanupStack::PopAndDestroy();
User::Leave(KErrArgument); // Leave if error in conversion.
}

CleanupStack::PopAndDestroy(); // Clean for converter

//HBufC* buf16=CnvUtfConverter::ConvertToUnicodeFromUtf8L(dataChunk);
//CleanupStack::PushL(buf16);
//TEMP STUFF
HBufC8* tempBuffer = HBufC8::NewL(ptr16.Length());
CleanupStack::PushL(tempBuffer );

TPtrC8 ptr(tempBuffer->Des());

RFile file;
TInt err=file.Open(fs, iDuKuFile, EFileWrite);
CleanupClosePushL(file);
if (err==KErrNotFound) // file does not exist - create it
{
err=file.Create(fs,iDuKuFile,EFileWrite);
}

TInt aPos=0;
file.Seek(ESeekCurrent, aPos);
file.Write(ptr); //save the file being downloaded
file.Close();
CleanupStack::PopAndDestroy(3);
Beover1984 2007-12-12
  • 打赏
  • 举报
回复
3.当这个文件是Ansi时,我用CnvUtfConverter::ConvertToUnicodeFromUtf8L转换保存后的文件,居然大小为0kb(期间无错误)

编码是ANSI,你却用ConvertToUnicodeFromUtf8L()来转换,当然得到不结果了,应该使用CCnvCharacterSetConverter进行转换,具体可以参考Forum Nokia网站上ChineseDisplay这个例子.

4.当这个文件是Unicode时,下载下来的文件是否不需要转换,即是Unicode?
Unicode有Little-Endian和Big-Endian,Symbian系统使用的是Little-Endian.
luyiyuan129 2007-12-12
  • 打赏
  • 举报
回复
所有问题解决,谢谢
dyw 2007-12-12
  • 打赏
  • 举报
回复
上面这个用于request,不是response。在response header collection中查找。
luyiyuan129 2007-12-12
  • 打赏
  • 举报
回复
因为下载下来之后,有程序要读这个文件,所以我想把下载下来的Ansi转成Unicode,方便其他程序读写
// This client accepts all content types.
// (change to e.g. "text/plain" for plain text only)
_LIT8(KAccept, "*/*");

上面这个代码好象已经可以接受所有文件,可是...唉
dyw 2007-12-12
  • 打赏
  • 举报
回复
服务端发什么就收什么,不必转换。俺也从来没有转换过。
在收到的Response Header中有MIME信息,可以知道是什么类型的文件。
luyiyuan129 2007-12-12
  • 打赏
  • 举报
回复
dyw,谢谢你
我现在就是按你的框架做的,原来接受的数据不完整,现在知道为什么了
现在唯一的问题,就是只要编码转换,他就是0kb(不转换,能够接受到Ansi的完整文件),你能否帮忙看一下我的Ansi转换的代码哪里出错了,谢谢
dyw 2007-12-12
  • 打赏
  • 举报
回复
草拟一段示范代码:
void CMyHttpEngine::MHFRunL(RHTTPTransaction aTransaction,
const THTTPEvent& aEvent)
{
switch (aEvent.iStatus)
{
case THTTPEvent::EGotResponseHeaders:
{
// Get HTTP status code from header (e.g. 200)
RHTTPResponse resp = aTransaction.Response();
TInt status = resp.StatusCode();
if (status == 200)
{
// 1、此处添加打开文件代码。
}
break;

case THTTPEvent::EGotResponseBodyData:
{
MHTTPDataSupplier* body = aTransaction.Response().Body();
TPtrC8 dataChunk;

// GetNextDataPart() returns ETrue, if the received part is the last
// one.
TBool isLast = body->GetNextDataPart(dataChunk);
// 2、此处将dataChunk写入文件。
if (isLast)
{
// 3、收到最后数据块,此处关闭文件
}

// Always remember to release the body data.
body->ReleaseData();
}
break;
...
}
luyiyuan129 2007-12-12
  • 打赏
  • 举报
回复
受不了了,还是0kb
3楼,不经编码转换时,可以接到数据的
dyw 2007-12-12
  • 打赏
  • 举报
回复
保存文件的方法有问题,每次都把前面保存的覆盖掉了。
办法:在收到Header(状态200 OK)时打开文件,收到Body时执行写入文件操作。Body中收到最后数据块,写入后即可关闭文件。

3,120

社区成员

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

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