获取远程文件的需求,一般用在网页采集,软件更新和网页静态化等时候。例如,你新做了一个新闻资讯网站,需要根据一些新闻机构发布的国内外新闻动态,自动采集相应的信息到自己的站点。又如,你新做的客户端软件往往用了一段时间,需要增加特别的功能,因此必须要增加一个软件自动升级的功能,这时候可采用远程获取文件的方法更新最新的补丁或程序。再如,现在设计网站,为了提高网站的访问速度,减轻网站服务器的访问压力,提高程序的性能,往往静态化是一种很好的选择,而且为了方便搜索引擎的收录,程序员们会将动态网页内容的页面生成了静态网页。
对此,如何实现上面的三种需求,是本篇文章来探讨的问题。我们将采用C#或VB.NET来获取远程文件。按照不同的需要,实现如下。
1)软件更新
通过WebRequest、WebResponse请求获取远程URL数据,之后使用FileStream文件流读写数据写入文件。
这里是使用vb.net来实现:
Private Sub GetUrlFile(ByVal url As String, ByVal filename As String)
'先通过URI建立一个WebRequest
Dim wr As WebRequest = WebRequest.Create(url)
'然后通过其GetResponse方法得到一个WebResponse
Dim res As WebResponse = wr.GetResponse
Dim fs As Stream
'通过WebResponse.GetResponseStream方法得到的流
fs = res.GetResponseStream
Dim fw As FileStream
'创建日期文件夹
Dim foldname As String = Format(Now, "yyyy-MM-dd")
If Directory.Exists(foldname) = False Then
Directory.CreateDirectory(foldname)
End If
'打开或创建文件以写入数据
fw = File.OpenWrite(foldname & "/" & filename & ".tif")
Dim b(1024) As Byte
'按块读取数据流
Dim br As Integer = fs.Read(b, 0, b.Length)
'循环读取并写入文件
While br > 0
fw.Write(b, 0, br)
br = fs.Read(b, 0, b.Length)
End While
'关闭数据流
fw.Close()
fs.Close()
End Sub
2)网页采集
网页采集所用到知识点,是通过HttpWebRequest、HttpWebResponse请求获取远程URL数据,之后使用StreamReader、StreamWriter文件流读写数据写入文件,注意还有编码Encoding。
这里是使用的是C#来实现:
2.1 先引用如下命令空间
using System;
using System.Net;
using System.IO;
using System.Text;
2.2 创建获取远程URL并生成文件的方法与文件夹不存在则自动建立方法。
url:远程URL
filename:生成文件名路径
pagecode:目标URL页面编码
protected void DownUrltoFile(string url, string filename, string pagecode)
{
try
{
//编码
Encoding encode = Encoding.GetEncoding(pagecode);
//请求URL
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
//设置超时(10秒)
req.Timeout = 10000;
this.NotFolderIsCreate(filename);
//获取Response
HttpWebResponse rep = (HttpWebResponse)req.GetResponse();
//创建StreamReader与StreamWriter文件流对象
StreamReader sr = new StreamReader(rep.GetResponseStream(),encode);
StreamWriter sw = new StreamWriter(Server.MapPath(filename), false,encode);
//写入内容
sw.Write(sr.ReadToEnd());
//清理当前缓存区,并将缓存写入文件
sw.Flush();
//释放相关对象资源
sw.Close();
sw.Dispose();
sr.Close();
sr.Dispose();
Response.Write("生成文件" filename "成功");
}
catch (Exception ex)
{
Response.Write("生成文件" filename "失败,原因:" ex.Message);
}
}
2.3 文件夹不存在则自动建立的代码:
filename表示文件名所在路径。
protected void NotFolderIsCreate(string filename)
{
string fileAtDir = Server.MapPath(Path.GetDirectoryName(filename));
if (!Directory.Exists(fileAtDir))
Directory.CreateDirectory(fileAtDir);
}
2.3 调用:
因为百度首页是utf-8编码,所以调用方法如下:
DownUrltoFile("https://www.baidu.com", "html/baidu.htm", "utf-8");
3)网页静态化
通过ASP.NET生成静态文件的文章网上有好多文章,通常ASP.NET生成静态文件的做法是使用文件流读取模板内容,之后替换模板内容中相关关键字,再生成静态文件。本文的做法另类一点,通过URL来生成静态文件,下面来看下是如何实现吧。
这里我们采用的方法是基于前面第2种案例,有了上面这个方法,可以很简单的通过动态文件URL来生成自己网站的静态文件了,也就是自己采集自己的动态网页生成静态页面,比如有一个新闻栏目,里面的新闻是这样访问的:
https://www.imdan.cn/news/show.aspx?id=1
https://www.imdan.cn/news/show.aspx?id=2
https://www.imdan.cn/news/show.aspx?id=n
我们看到站点下建立了一个文件夹“dongtai”是专门放动态页面来显示新闻的,现在我们建一个文件夹“html”存放静态网页,再新建一个“news”文件夹放生成的静态网页。生成的静态网页文件名可以根据日期时间来命名,如保存这样:html/news/20091224-001.html。在后台添加保存新闻后,可以调用这个方法生成这篇新闻的静态网页:
DownUrltoFile("https://www.imdan.cn/news/show.aspx?id=1", "html/news/20091224-001.html", "GB2312");
其中URL:https://www.imdan.cn/news/show.aspx?id=1 是动态显示新闻,生成了一个静态页面20091224-001.html,保存在html/news/下。看,这样就可以生成静态文件了。以上的做法是不使用模板来生成静态文件的方法,只是换个思路来做。
经过上面的讲解,或许你已经了解了这三种需求的实现方法,获取远程文件的方法在网站开发和软件编程中是经常会碰到的,希望本篇文章可以帮助到你。