下面是我的一段下载文件的代码:
{
……
CInternetSession *m_pSession = new CInternetSession();
CHttpFile* pFile = (CHttpFile*)(m_pSession->OpenURL(sUrl,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE ));
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK)
……
else
……
}
我的电脑上 dwRet = 200 正确,但有的别的电脑 dwRet = 404,说 找不到sUrl,但是我跟进去 sUrl 没错,可以用IE浏览器打开!
求各位帮忙,到底是什么原因有的电脑OpenURL不成功,以及解决方法!!!
{
……
CInternetSession *m_pSession = new CInternetSession();
CHttpFile* pFile = (CHttpFile*)(m_pSession->OpenURL(sUrl,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE ));
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK)
……
else
……
}
我的电脑上 dwRet = 200 正确,但有的别的电脑 dwRet = 404,说 找不到sUrl,但是我跟进去 sUrl 没错,可以用IE浏览器打开!
求各位帮忙,到底是什么原因有的电脑OpenURL不成功,以及解决方法!!!
对了,那台出错的电脑上有一些比较小的文件还是可以下到的,比如下载列表文件,但大一点的文件就会出错,我电脑上从来没出现过这个问题,真是囧死了……
是因为OpenURL(sUrl,……)的sUrl里有汉字!!!
但是为什么我的电脑没问题,有的电脑就会出错呢?晕啊!!!
问题产生的原因是因为,在有的电脑上OpenURL中的sUrl包含汉字时自身进行的URL编码会出错(虽然还不找到是什么原因)。
在网上找到了URL编码程序,在OpenURL之前先把下载文件名进行一遍URL编码,就OK了。
URL编码程序:
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x + 55: x + 48;
}
CString URLEncode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
BYTE b = 0;
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp))
*pOutTmp++ = *pInTmp;
else
if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);
*pOutTmp++ = toHex(*pInTmp%16);
}
pInTmp++;
}
*pOutTmp = '\0';
//sOut=pOutBuf;
//delete [] pOutBuf;
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
感谢 http://blog.csdn.net/zhengyun_ustc/ 这个BLOG的作者!