首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CInternetSession上载文件,OpenURL的的参数有中文字符时不能返回正确值

2012-12-17 
CInternetSession下载文件,OpenURL的的参数有中文字符时不能返回正确值。本帖最后由 oyljerry 于 2012-11-1

CInternetSession下载文件,OpenURL的的参数有中文字符时不能返回正确值。
本帖最后由 oyljerry 于 2012-11-14 11:13:43 编辑 下面的代码中:
fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
szFile有中文字符时,fTargFile将为空,是什么原因?如何解决?

代码如下:


int nTerminate  = 0;
int nDownloaded = 0;

UINT DownloadFile(LPVOID pParam)
{
CWnd*pwnd = AfxGetMainWnd();
CProgressCtrl*m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);
CButton*bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);

charfilebuf[512];
CInternetSessionnetSession;
CStdioFile*fTargFile;
intoutfs;
CStringszFile,FileSize,KBin,KBsec,NewName,Perc;

try
{
pwnd->GetDlgItemText(IDC_EDIT1,szFile);
pwnd->SetDlgItemText(IDC_STAT,"正在校验下载地址...");
fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
nDownloaded = 1;

COleDateTime dlStart = COleDateTime::GetCurrentTime();
int filesize = fTargFile->SeekToEnd();
fTargFile->SeekToBegin();
outfs = filesize / 1024;// 计算文件大小(千字节)
FileSize.Format("%d",outfs);// 以KB为单位格式文件大小

// 在当前目录创建新的目标文件
CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
int byteswrite;// 写入文件的字节数
int pos = 0;// 当前进度条的位置
int nperc,kbrecv;// 进度条的百分比,获取到的数据大小(Kbs为单位)
double secs,kbsec;// 记录秒数, 速度(KB/秒)

// 如果文件名太长,缩短窗口的标题并在状态显示
NewName = fTargFile->GetFileName();// 获取新文件名

if(fTargFile->GetFileName().GetLength() >= 10)
{
NewName = fTargFile->GetFileName().Mid(0,7);// 分割文件
NewName = NewName + "...";
}

pwnd->SetDlgItemText(IDC_STAT,"正在下载...");
m_Prog->SetRange32(0,filesize);

while (byteswrite = fTargFile->Read(filebuf, 512))// 读取文件
{
if(nTerminate == 1)// 如果点击取消下载
{
fDestFile.Close();// 关闭我们的目标文件
fTargFile->Close();// 关闭远程文件
delete fTargFile;// 删除CStdioFile对象,以防止泄漏
pwnd->SetDlgItemText(IDC_STAT,"下载时已被用户取消!"); // Set satus bar text
AfxEndThread(0);// 结束下载线程
}

// 根据开始时间与当前时间比较,获取秒数
COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
secs = dlElapsed.GetTotalSeconds();
pos = pos + byteswrite;// 设置新的进度条位置
fDestFile.Write(filebuf, byteswrite);// 将实际数据写入文件
m_Prog->SetPos(pos);

nperc = pos * 100 / filesize;// 进度百分比
kbrecv = pos / 1024;// 获取收到的数据
kbsec = kbrecv / secs;// 获取每秒下载多少(KB)

Perc.Format("%d",nperc);// 格式化进度百分比
KBin.Format("%d",kbrecv);// 格式化已下载数据大小(KB)
KBsec.Format("%d",(int)kbsec);// 格式化下载速度(KB/秒)

pwnd->SetDlgItemText(IDC_EDIT_FILESIZE,FileSize + "KB");// 远程文件大小
pwnd->SetDlgItemText(IDC_EDIT_SIZEOK,KBin + "KB");// 已下载大小
pwnd->SetDlgItemText(IDC_EDIT2,KBsec + "KB/秒");// 下载速度
pwnd->SetDlgItemText(IDC_EDIT4,Perc + "%");// 进度百分比
}
// 下载完成,关闭文件
fDestFile.Close();


}

catch(CInternetException *IE)
{
CString strerror;
TCHAR error[255];

IE->GetErrorMessage(error,255); // 获取错误消息
strerror = error;

pwnd->SetDlgItemText(IDC_STAT,strerror);
pwnd->SetDlgItemText(IDB_BTN_STOP,"Exit");
nDownloaded = 0;
delete fTargFile;
IE->Delete();// 删除异常对象,以防止泄漏
}
// 恢复默认
pwnd->SetDlgItemText(IDC_EDIT2,"Kb/秒");
pwnd->SetDlgItemText(IDC_EDIT3,"Loading...");
pwnd->SetDlgItemText(IDC_EDIT4,"0%");

delete fTargFile;
if(nDownloaded == 1)
{
pwnd->SetDlgItemText(IDC_STAT,"下载完成!");
bStart->EnableWindow(TRUE);
}
return 0;
}


[最优解释]
可以用UrlEscape把URL中的非安全字符(中文就是非安全字符)转换成安全字符
[其他解释]
中文字符要进行对应的encode
[其他解释]
url 需要标准化, 还有注意服务器需要的编码(UTF8, GB)
具体参看MSDN类似函数 InternetCanonicalizeUrl
[其他解释]
能说具体点吗?
[其他解释]
自已顶一下。
[其他解释]
真的没有人会了吗
[其他解释]
有具体例子吗?

热点排行