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

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

根据传入的MIME类型自动确定并替换Url中的原始扩展名(如果有的话),以用作下载文件的文件名。
判断传入的存储目录中是否已存在与下载文件名相同的文件,存在的话就进行重命名,直到没有同名文件为止。
功能有点多了,不适合做范例,不过还是很实用的,所以这里就顺道分享出来。
其代码为:

string 生成下载文件存放路径(string 存放目录, Uri Uri, string ContentType)
{
var ex = 获取对应扩展名(ContentType);
string up = null;
string upne = null;
if (Uri.LocalPath == "/")
{
//处理Url是域名的情况
up = upne = Uri.Host;
}
else
{
if (Uri.LocalPath.EndsWith("/"))
{
//处理Url是目录的情况
up = Uri.LocalPath.Substring(0, Uri.LocalPath.Length - 1);
upne = Path.GetFileName(up);
}
else
{
//处理常规Url
up = Uri.LocalPath;
upne = Path.GetFileNameWithoutExtension(up);
}
}
var name = string.IsNullOrEmpty(ex) ? Path.GetFileName(up) : upne + "." + ex;
var fn = Path.Combine(存放目录, name);
var x = 1;
while (File.Exists(fn))
{
fn = Path.Combine(存放目录, Path.GetFileNameWithoutExtension(name) + "(" + x++ + ")" + Path.GetExtension(name));
}
return fn;
}

为了验证其效果,我们通过一个单元测试进行评测:

[TestMethod]
public void 文件名生成测试()
{
var d = @"C:UsersPublicDownloads";
//gif格式文件,正常下载
Assert.AreEqual(@"C:UsersPublicDownloads35ad5275ed17904d4a2d40f3dacea80b.gif", 生成下载文件存放路径(d, new Uri("/upload/2009-11/20091112231022422.gif"), "image/gif"));
//url中扩展名是gif,但MIME类型实际是image/jpeg的资源。下载后的扩展名是jpe,因为字典MimeDic里存储的对应扩展名就是jpe。
Assert.AreEqual(@"C:UsersPublicDownloads35ad5275ed17904d4a2d40f3dacea80b.jpe", 生成下载文件存放路径(d, new Uri("/upload/2009-11/20091112231022422.gif"), "image/jpeg"));
//一个带参数的网页url。下载后的扩展名是dhtml,因为字典MimeDic里存储的对应扩展名就是dhtml。
Assert.AreEqual(@"C:UsersPublicDownloadsfiledownload.dhtml", 生成下载文件存放路径(d, new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), "text/html"));
//一个网页url,其格式为目录形式的,没有确切文件名。
Assert.AreEqual(@"C:UsersPublicDownloadsg9675.dhtml", 生成下载文件存放路径(d, new Uri("http://www.guaishow.com/u/luanfujie/g9675/"), "text/html"));
//域名形式
Assert.AreEqual(@"C:UsersPublicDownloadswww.g.cn.dhtml", 生成下载文件存放路径(d, new Uri("http://www.g.cn/"), "text/html"));
Assert.AreEqual(@"C:UsersPublicDownloadsg.cn.dhtml", 生成下载文件存放路径(d, new Uri("http://g.cn"), "text/html"));
}

文件下载
万事俱备,只欠东风了,让我们来完成下载方法: