从网站下载PDF内容 -

时间:2011-04-30 19:56:58

标签: c#

我正在尝试将PDF下载到我的桌​​面 - 每隔几天PDF会更新新内容,我试图看看是否有办法让PDF在有新内容时自动更新自己的内容无需转到实际链接。

- http://www.uakron.edu/dotAsset/1265971.pdf

1 个答案:

答案 0 :(得分:2)

假设这是甚至远程编程问题,您可以尝试HTTP HEAD查询(理想情况下在请求中发送If-Modified-Since标头),并检查响应标头 - 如果是服务器很友好,它会告诉你它是否没有通过304响应代码更新。

如果您没有获得304,则发出GET请求并保存响应流。

您也可以尝试发布最后修改的GET(跳过HEAD);但是如果服务器对GET / 304不满意,HEAD请求可能会节省一些带宽。

未经广泛测试,但是:

using System;
using System.IO;
using System.Net;

static class Program
{
    static void Main()
    {
        string url = "http://www.uakron.edu/dotAsset/1265971.pdf", localPath = "1265971.pdf";

        var req = (HttpWebRequest)WebRequest.Create(url);
        req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        req.Headers.Add("Accept-Encoding","gzip,deflate");
        if(File.Exists(localPath))
            req.IfModifiedSince = File.GetLastWriteTimeUtc(localPath);
        try
        {
            using (var resp = req.GetResponse())
            {
                int len;
                checked
                {
                    len = (int)resp.ContentLength;
                }
                using (var file = File.Create(localPath))
                using (var data = resp.GetResponseStream())
                {
                    byte[] buffer = new byte[4 * 1024];
                    int bytesRead;
                    while (len > 0 && (bytesRead = data.Read(buffer, 0, Math.Min(len, buffer.Length))) > 0)
                    {
                        len -= bytesRead;
                        file.Write(buffer, 0, bytesRead);
                    }
                }
            }
            Console.WriteLine("New version downloaded");
        }
        catch (WebException ex)
        {
            if (ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
                throw;
            Console.WriteLine("Not updated");
        }
    }
}