Imdan.cn

我的网络生活

.net获取远程文件

   获取远程文件的需求,一般用在网页采集,软件更新和网页静态化等时候。例如,你新做了一个新闻资讯网站,需要根据一些新闻机构发布的国内外新闻动态,自动采集相应的信息到自己的站点。又如,你新做的客户端软件往往用了一段时间,需要增加特别的功能,因此必须要增加一个软件自动升级的功能,这时候可采用远程获取文件的方法更新最新的补丁或程序。再如,现在设计网站,为了提高网站的访问速度,减轻网站服务器的访问压力,提高程序的性能,往往静态化是一种很好的选择,而且为了方便搜索引擎的收录,程序员们会将动态网页内容的页面生成了静态网页。

   对此,如何实现上面的三种需求,是本篇文章来探讨的问题。我们将采用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/下。看,这样就可以生成静态文件了。以上的做法是不使用模板来生成静态文件的方法,只是换个思路来做。


经过上面的讲解,或许你已经了解了这三种需求的实现方法,获取远程文件的方法在网站开发和软件编程中是经常会碰到的,希望本篇文章可以帮助到你。

转摘www.imdan.cn

评论

© Imdan.cn | Powered by LOFTER