HttpQueryInfo 获取服务器文件大小 问题

qjzrd 2009-08-30 08:56:52
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <winsock.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib,"WSOCK32.lib")



long CGetServerFileSize(const char *httpurl)
{
char Buffer[32] = {0};
DWORD BufLen = sizeof(Buffer);
DWORD WIndex = 0;
long dwFileSize = 0;
HINTERNET hOpen = InternetOpen("Update1.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET HTTPConnect = InternetOpenUrl(hOpen, httpurl, NULL, 0, INTERNET_FLAG_RELOAD, 0);
::HttpQueryInfo(HTTPConnect,HTTP_QUERY_CONTENT_LENGTH, Buffer, &BufLen, &WIndex);
dwFileSize = (DWORD)atol(Buffer);
printf("%s\n", Buffer);
InternetCloseHandle(HTTPConnect);
InternetCloseHandle(hOpen);
return dwFileSize;
}

void main(void)
{
CGetServerFileSize("http://127.0.0.1/赵咏华-最浪漫的事.mp3");

}

发现要是用含有中文的名字 去获取大小就不对, 要是换成英文的文件名就可以了, 那么怎么做让它用中文的也可以呢 谢谢
...全文
866 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-08-31
  • 打赏
  • 举报
回复
因为你下载需要知道的是content length而不是文件大小,下载完成的标志是你把整个content读下来,content不是文件的直接内容,你读“文件大小”那么多字节,是不足够的

我觉得楼主最关键的是要理解什么是http的content,
抓个包看看当文件名是中文时你到底收到了什么去理解吧

[Quote=引用 3 楼 qjzrd 的回复:]
要是不知道文件大小 你怎么知道下载完成没有呢


[/Quote]
haggard_hunan 2009-08-31
  • 打赏
  • 举报
回复
InternetReadFile如何读完了,会返回长度为0的,所以其实没有必要去开始获取长度的.....
hellolzjwx 2009-08-31
  • 打赏
  • 举报
回复
char 换成TCHAR
TCHAR 当为ANSI的时候是char 当为UNICODE的时候是wchar
qjzrd 2009-08-30
  • 打赏
  • 举报
回复
要是不知道文件大小 你怎么知道下载完成没有呢

arong1234 2009-08-30
  • 打赏
  • 举报
回复
content length只反映了服务器和你通讯的http报文的长短,文件的长度和它没有线性关系,由于编码方式的不同,同样大小的文件可能需要传输的字节长度可能完全不同,因此我个人觉得你根本不可能获得文件准确长度,例如,即使文件名不是英文的,文件类型变了,说不定长度也不对了(而且,获得文件长度的必要性也不大,contentlength也许更重要一点)
yangkunhenry 2009-08-30
  • 打赏
  • 举报
回复
你用的是char型的。换成TCHAR。
把.h文件里面的代码放出来一下,CPP就不放了,自己下载哦。 #ifndef Download_h__ #define Download_h__ #include #pragma comment(lib,"wininet.lib") class CHttpGet { public: //测试网络是否连接成功。 BOOL TestNetworkIsConnected(); //动态获取URL的文件名。 //LPCTSTR szURL URL地址 //LPSTR pFileName 文件名缓冲区,获取到文件名后,会文件名放入到该buffer //DWORD dwBufferOfLenght pFileName缓冲区大小。 //pResult 是否成功。 BOOL HttpGetFileName(LPCTSTR szURL,LPSTR pFileName,DWORD dwBufferOfLenght,BOOL * pResult); //将文件下载到缓冲区,而不是保存到文件 //szURL URL地址 //szBuffer 缓冲区。 //dwSize 缓冲区大小 //lpdwSizeOfRet实际下载到的数据大小。 DWORD URLDownloadToBuffer(LPCTSTR szURL,LPBYTE szBuffer,DWORD dwSize,DWORD *lpdwSizeOfRet); //下载文件 //szURL URL地址 //szFileSavePath 文件完整保存路径 // CheckFileTypeIsPe 是否需要检测文件是不是PE文件。 DWORD URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe); }; #endif // Download_h__ CPP部分代码,详细自己下载。 完全原创。代码注释详细。 使用及其方便... DWORD CHttpGet::URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe) { if(!CheckUrl(szURL)) return FALSE; HINTERNET hInternetOpen = InternetOpen( "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", INTERNET_OPEN_TYPE_PRECONFIG,/*返回注册表中代理或直接的配置*/ NULL,//不使用代理 所以不要设置用户名 NULL,//不使用代理 所以不用设置密码 NULL ); if(hInternetOpen == NULL) return FALSE; HINTERNET hInternetUrl = InternetOpenUrl( hInternetOpen, szURL, "Accept: */*",//支持左所有文件 -1, INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE,/*不要从缓冲里面获取数据 */ NULL); if(hInternetUrl == NULL) return FALSE; CHAR szStatus[1024]={NULL}; DWORD dwBufferLen = sizeof(szStatus); //查询状态 HttpQueryInfo(hInternetUrl,HTTP_QUERY_STATUS_CODE,szStatus,&dwBufferLen;,NULL); //4xx(请求错误) DWORD dwCode = atoi(szStatus); if( dwCode > 400 && dwCode < 500) return FALSE; //5xx(服务器错误) if( dwCode >500 && dwCode < 600) return FALSE; //开始下载文件 HANDLE hFile = CreateFile(szFileSavePath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return FALSE; } CHAR szReadBuffer[4096]={NULL}; DWORD dwInternetReadOfByte = 0; DWORD dwWriteByte = 0; BOOL bFirst = FALSE; BOOL bResult = TRUE; do { BOOL bRet = InternetReadFile(hInternetUrl,szReadBuffer,sizeof(szReadBuffer),&dwInternetReadOfByte;); //说明文件传送完了。 if(bRet == TRUE && dwInternetReadOfByte == 0) break; if(bFirst == FALSE && CheckFileTypeIsPe==TRUE) { bFirst = TRUE; if(((PIMAGE_DOS_HEADER)szReadBuffer)->e_magic!= IMAGE_DOS_SIGNATURE) { bResult = FALSE; break; } } WriteFile(hFile,szReadBuffer,dwInternetReadOfByte,&dwWriteByte;,NULL); } while (TRUE); CloseHandle(hFile); InternetCloseHandle(hInternetUrl); InternetCloseHandle(hInternetOpen); return bResult; }

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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