0

我正在尝试从如下链接下载文件: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”标头?

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

我还检查了“Content-Length”标头,它与 的值不同response.GetResponse().ToString().Length,也许标头也算作长度?

4

1 回答 1

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);
于 2012-12-26T19:24:47.780 回答