我不知道我下载的是哪个文件

本文关键字:文件 下载 我不知道 | 更新日期: 2023-09-27 17:49:31

我正在尝试下载一个文件,从一个链接,看起来像: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());
        }
    }
}

难道没有比这更简单的吗?
是否有任何机会,我将下载一个文件,而不是得到一个"内容处理"头?

最后一件事,此刻我正试图使用StreamWriter写文件,但结果文件已损坏。我认为这与不以二进制格式编写有关,但我不确定。

我也检查了"内容长度"头,它是一个不同的值比response.GetResponse().ToString().Length,也许头是计算它的长度?

我不知道我下载的是哪个文件

你可以为这个扩展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);