我正在尝试从以下链接下载文件: 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
的值不同,也可能会将标题计算为长度?
答案 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);