不知道我正在下载哪个文件

时间:2012-12-26 19:09:32

标签: c# http-headers httpwebrequest

我正在尝试从以下链接下载文件: www.sample.com/download.php?id=1234231

我不知道我会从这个链接获得哪个文件。 首先我尝试了webclient.downloadfile(link,path) - 但我给出的文件路径应该是文件夹给我一个访问被拒绝错误。 我的问题是我无法确定我会得到的文件。

我尝试过类似的事情:

var wreq = (HttpWebRequest)HttpWebRequest.Create(link);
using (var res = (HttpWebResponse) wreq.GetResponse())
{
    using (var reader = new StreamReader(res.GetResponseStream()))
    {
        //get filename Header
        var filenameHeader =
            res.GetResponseHeader("Content-Disposition")
               .Split(';')
               .Where(s => s.Contains("filename"))
               .ToList()[
                   0];
        var fileName = filenameHeader.Replace(" ", "").Split('=')[1];
        //clear fileName
        fileName = fileName.Replace(":", "");
        using (var writer = new StreamReader(Path.Combine(folderToSave , fileName),FileMode.Create))
        {
            writer.Write(reader.ReadToEnd());
        }
    }
}

有没有比这简单的东西?
我有没有机会下载文件而没有获得“Content-Disposition”标题?

最后,我正在尝试使用StreamWriter编写文件,但生成的文件已损坏。我认为这与不以二进制格式编写有关,但我不确定。

我还检查了“内容长度”标题,它与response.GetResponse().ToString().Length的值不同,也可能会将标题计算为长度?

1 个答案:

答案 0 :(得分:1)

您可以为此

扩展WebClient类
  class MyWebClient : WebClient
  {
     public string FileName { get; private set; }

     protected override WebResponse GetWebResponse(WebRequest request)
     {
        WebResponse response = base.GetWebResponse(request);

        FileName = Regex.Match(((HttpWebResponse)response).Headers["Content-Disposition"], "filename=(.+?)$").Result("$1");
        string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
        Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
        FileName = r.Replace(FileName, "-");
        return response;
     }
  }

用法:

     MyWebClient mwc = new MyWebClient();
     byte[] bytes = mwc.DownloadData("http://subtitle.co.il//downloadsubtitle.php?id=202500");
     File.WriteAllBytes(Path.Combine(folderToSave, mwc.FileName), bytes);