asp.net 下载文件时根据MIME类型自动判断保存文件的扩展名

2019-05-11 19:49:38王振洲


/// <summary>
/// 下载文件到指定目录,并返回下载后存放的文件路径
/// </summary>
/// <param name="Uri">网址</param>
/// <param name="存放目录">存放目录,如果该目录中已存在与待下载文件同名的文件,那么将自动重命名</param>
/// <returns>下载文件存放的文件路径</returns>
public string 下载文件(Uri Uri, string 存放目录)
{
var q = WebRequest.Create(Uri).GetResponse();
var s = q.GetResponseStream();
var b = new BinaryReader(s);
var file = 生成下载文件存放路径(存放目录, Uri, q.ContentType);
FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);
fs.Write(b.ReadBytes((int)q.ContentLength), 0, (int)q.ContentLength);
fs.Close();
b.Close();
s.Close();
return file;
}

代码很简单,就不多说了,我们来完成最后的测试:

[TestMethod]
public void 文件下载测试()
{
var d = @"C:UsersPublicDownloads";
//首次下载
Assert.AreEqual(@"C:UsersPublicDownloadsfiledownload.dhtml", 下载文件(new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), d));
//第二次下载,遇到同名文件,自动重命名
Assert.AreEqual(@"C:UsersPublicDownloadsfiledownload(1).dhtml", 下载文件(new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), d));
//下载一个原本是gif类型的文件
Assert.AreEqual(@"C:UsersPublicDownloads2naqyw8.gif", 下载文件(new Uri("http://i38.tinypic.com/2naqyw8.jpg"), d));
}

结语
相较WebClient而言,WebRequest拥有更好的可控性,在WebClient无解的时候,就尝试让WebRequest上场吧。
范例源代码和本文的XPS版本打包下载
http://xiazai.jb51.net/200911/yuanma/asp.net_mime_down.rar
转载http://skyd.cnblogs.com/