vb编写的web服务器,怎样用来下载mp3等文件
你需要先研究一下http协议的相关内容
这里有篇简单的内容供你参考
http://hibaiducom/sdfiyon/blog/item/25ba0ec7e0e53ad8d0006036html
如果你想自己写个程序相互传文件比较简单,如果你想让你的程序支持浏览器的下载,就比较复杂了,呵呵
# 先从工作拷贝中删除自己做的修改
svn revert /
#如果有子目录,可以加 -R选项:
#svn revert -R /
#注意: 本子命令不会访问网络,它解除任何冲突的状态。但是,它不恢复被删除的目录。
# 然后从库中取出最新版本
svn up
下载整站源码,一般是做不到,几乎没有人愿意把自己的辛辛苦苦建起的网站让别人随意复制去。不过,我们还是可以下载一些网站内容方面的信息的。下面是一些方法,不妨试试:
1借助离线浏览工具,如Teleport Pro,Offline Explorer Enterprise等等。如果是静态网页的话,那么离线浏览工具甚至可以把整个网站都可以下载下来。
2如果是你的目标是论坛之类,也可以用一些采集器之类的软件。
3如果是动态网页,因为我们在自己的浏览器里看到的网页都是被网站的服务器解释过的,所以无法把它逆向变为原动态网页内容,除非你知道转换规则。再所以,要想把网站上的内容原原本本的复制过来,只能是通过非法途径,攻击服务器,上传木马,取得权限。。。呵呵,希望不要做非法的事情,只是一个思路而已。
欢迎来到我的网站http://www3quartersorg四分之三,一步步做网站交流,相互学习。
用MFC的CInternetFile,CInternetSession,CHttpConnection等类,已知服务器名及文件路径,代码越简单越好。
以下是代码片段:
//Download http file through proxy
//--------------------------------------------------------------------------------
We can find details about Proxy Authentication and Sever Authentication methed in MSDN
Just search for the keyword "INTERNET_OPTION_USERNAME"
Here I give a very simple example It works in my project
CString GeHttptFile(const char url)
{
CString szContent;
char strProxyList[MAX_PATH], strUsername[64], strPassword[64];
//in this case "proxya" is the proxy server name, "8080" is its port
strcpy(strProxyList, "proxya:8080");
strcpy(strUsername, "myusername");
strcpy(strPassword, "mypassword");
DWORD dwServiceType = AFX_INET_SERVICE_HTTP;
CString szServer, szObject;
INTERNET_PORT nPort;
AfxParseURL(url, dwServiceType, szServer, szObject, nPort);
CInternetSession mysession;
CHttpConnection pConnection;
CHttpFile pHttpFile;
pConnection = mysessionGetHttpConnection(szServer,
INTERNET_FLAG_KEEP_CONNECTION,
INTERNET_INVALID_PORT_NUMBER,
NULL, NULL);
pHttpFile = pConnection->OpenRequest("GET", szObject,
NULL, 0, NULL, NULL,
INTERNET_FLAG_KEEP_CONNECTION);
//here for proxy
INTERNET_PROXY_INFO proxyinfo;
proxyinfodwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfolpszProxy = strProxyList;
proxyinfolpszProxyBypass = NULL;
mysessionSetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME, strUsername, strlen(strUsername)+1);
pHttpFile->SetOption(INTERNET_OPTION_PROXY_PASSWORD, strPassword, strlen(strPassword)+1);
pHttpFile->SendRequest(NULL);
DWORD nFileSize = pHttpFile->GetLength();
LPSTR rbuf = szContentGetBuffer(nFileSize);
UINT uBytesRead = pHttpFile->Read(rbuf, nFileSize);
szContentReleaseBuffer();
pHttpFile->Close();
delete pHttpFile;
pConnection->Close();
delete pConnection;
mysessionClose();
return szContent;
}
bool SaveUrl(LPCTSTR url, LPCTSTR filename)
{
HINTERNET hNet = ::InternetOpen("Outlook",
PRE_CONFIG_INTERNET_ACCESS,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0) ;
HINTERNET hUrlFile = ::InternetOpenUrl(hNet,
url,
NULL,
0,
INTERNET_FLAG_RELOAD,
0) ;
char buffer[101024] ;
DWORD dwBytesRead = 1;
BOOL bRead=TRUE;
CFile file;
fileOpen(filename,CFile::modeCreate|CFile::modeWrite);
while(bRead&&dwBytesRead>0)
{
bRead = ::InternetReadFile(hUrlFile,
buffer,
sizeof(buffer),
&dwBytesRead);
if(dwBytesRead>0)
fileWrite(buffer,dwBytesRead);
}
::InternetCloseHandle(hUrlFile) ;
::InternetCloseHandle(hNet) ;
fileClose();
AfxMessageBox("finished");
return bRead;
}
void CC02021101Dlg::OnOK()
{
// TODO: Add extra validation here
bool bret=SaveUrl("http://clubpchomenet/bbs2phptopic=40&lanmuid=2","C:\\temp\\testhtml");
if(bret)
AfxMessageBox("true");
else
AfxMessageBox("false");
}
下载事件说明:
OnDownloadBegin <--开始下载
OnDownloadComplete <--下载结束
OnDocumentComplete <--页面下载完毕
对于每个HTML页面,顺序都是如此如果是Frame或IFrame的文件都会当成HTML页面处理也就是说如果一个页面中有3个IFrame,那么总共会触发4次BeforeNavigate2事件
对于每个连接且需要显示出来的二进制文件(如gif,bmp,jpg)都会触发一个DownloadBegin和DownloadComplete事件
那我们怎么判断是否全部下载完毕呢嘿嘿,TWebBrowser控件不是有一个Busy属性的吗包括相关文件:
#include
#include
#import
做成了:
Bool GetFromWeb(LPSTR pURL, LPSTR
SaveAsFilePath )
{ CInternetSession session; //会话期对象)
CHttpConnection pServer = NULL; // 指向服务器地址(URL)
CHttpFile pHttpFile = NULL; // HTTP文件指针
CString strServerName; //服务器名
CString strObject; //查询对象名(http文件)
INTERNET_PORT nPort; //端口
DWORD dwServiceType; //服务类型
DWORD dwHttpRequestFlags = //请求标志
INTERNET_FLAG_EXISTING_CONNECT
INTERNET_FLAG_NO_AUTO_REDIRECT;
const TCHAR szHeaders[] = _T("Accept: text/\r\nUser-Agent: HttpClient\r\n");
BOOL OK=AfxParseURL( //词法分析
pszURL, //被分析URL串
dwServiceType, //服务类型,ftp,http等
strServerName, //服务器名
strObject, //URL中被查询对象
nPort ); //URL指定的端口,可能为空
OK=OK && //本例只考虑http协议
(dwServiceType ==
INTERNET_SERVICE_HTTP);
if (!OK)
{ AfxMessageBox("URL出错"); //报错
return false;
}
pServer = sessionGetHttpConnection(strServerName, nPort); /获得服务器名
pHttpFile = pServer-> OpenRequest( CHttpConnection::HTTP_VERB_GET,strObject, NULL, 1, NULL, NULL,dwHttpRequestFlags);
//向服务器发送请求,建立http连接,
//建立本机上的http文件指针
pHttpFile->AddRequestHeaders(szHeaders);
pHttpFile->SendRequest(); //发送请求
CStdioFile f; //输出文件对象
if( !fOpen( //打开输出文件
SaveAsFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeText ) )
{ MessageBox( "Unable to open file";
return false;
}
//下面将检索结果保存到文件上
TCHAR szBuf[1024]; //缓存
while (pHttpFile->ReadString(szBuf, 1023))
fWriteString( szBuf );
fClose(); //善后工作
pHttpFile ->Close();
pServer ->Close();
if (pHttpFile != NULL) delete pHttpFile;
if (pServer != NULL) delete pServer;
sessionClose();
return true;
}
0条评论