http://www.xxxxx.cn/iclk/?uid=62382&aid=67&linkuid=假设打开这个网址 能够下载一个 xxx.rar下载是搞定了 但是怎么获取文件名? //这个能下载上面的 但是文件名怎么得到?  如果取?uid=62382&aid=67&linkuid= 这样的话 文件名不能有?号
//正常地址 比如 http://www.baidu.com/xxx.rar
//可以直接取xxx.rar 但是上面特殊的怎么取原始文件名?
//拜托了 坐等回复...3Q 3Q
BOOL DownURLOperate::DownLoadFile(LPSTR URL, LPSTR szSavePath)
{
HANDLE hFile = CreateFile(szSavePath,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);


if(hFile == INVALID_HANDLE_VALUE)
return FALSE;

HINTERNET hInternet, hUrl; hInternet = InternetOpen("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) "
 "AppleWebKit/534.16 (KHTML, like Gecko) "
 "Chrome/10.0.648.204 Safari/534.16", 
 INTERNET_OPEN_TYPE_PRECONFIG,NULL,
 INTERNET_INVALID_PORT_NUMBER,0);

if(hInternet == NULL)
return FALSE;

hUrl = InternetOpenUrlA(hInternet, URL, NULL, 0, INTERNET_FLAG_RELOAD, 0);

if(hUrl == NULL)
return FALSE;

CHAR Buffer[1024]={NULL};
DWORD dwBytesRead = 0 , NumberOfBytesWritten =0;
BOOL bIsFirstPacket = true,bRet = true;
BOOL bResult = FALSE;
do
{
memset(Buffer, 0, sizeof(Buffer));
bResult=InternetReadFile(hUrl, Buffer, sizeof(Buffer), &dwBytesRead);
if (bResult&&bIsFirstPacket && ((PIMAGE_DOS_HEADER)Buffer)->e_magic!= IMAGE_DOS_SIGNATURE)
{
bRet = false;
break;
}

bIsFirstPacket = false;

WriteFile(hFile,Buffer,dwBytesRead,&NumberOfBytesWritten,NULL);

} while((dwBytesRead > 0)&&(bResult!=FALSE));

CloseHandle(hFile);

InternetCloseHandle(hUrl);
InternetCloseHandle(hInternet);

return TRUE;
}

解决方案 »

  1.   

    获取header,header里应该有正确的文件名。
      

  2.   

    获得重定向后的文件名,迅雷不也做不到吗?只有下载后才发现是另外一个文件。不过重定向是可以通过HTTP 状态码判断的
      

  3.   

    LZ,你知道WinInet是怎么工作的吗?其实它是发了两次请求,第二次是自动重定向如果你要获得真实的文件名,需要自己手动实现2次请求发送首先,OpenRequest传入INTERNET_FLAG_NO_AUTO_REDIRECT,遇到REDIRECT会报错,302。这是重定向的HTTP 状态码然后你使用 CHttpFile::QueryInfo HTTP_QUERY_CUSTOM HTTP_QUERY_FLAG_REQUEST_HEADERS 标记查询Request Header,获取真实文件名
      

  4.   

    获取header,header里应该有正确的文件名。
      

  5.   

    哈哈 搞定了 其实很简单获取HTTP 返回的报文包含302 说明有跳转Location 字段就是要跳转的地址结贴