一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

下載文件時(shí)根據(jù)MIME類型自動(dòng)判斷保存文件的擴(kuò)展名

mime 引言

用WebClient下載遠(yuǎn)程資源時(shí),經(jīng)常會(huì)遇到類似這樣的網(wǎng)址:

http://www.uushare.com/filedownload?user=icesee&id=2205188

http://www.guaishow.com/u/luanfujie/g9675/

我們不知道這個(gè)Url具體代表的是一個(gè)網(wǎng)頁(yè),還是某種類型的文件。

而有些Url雖然帶有擴(kuò)展名,但可能是錯(cuò)誤的擴(kuò)展名,常見(jiàn)的比如把gif文件標(biāo)上了jpg擴(kuò)展名。

如果我們沒(méi)法正確判斷下載源的文件類型的話,就無(wú)法保存為正確的文件格式,會(huì)給后續(xù)操作及人工閱覽造成困擾。

所幸的是,WebRequest可以給出下載源的MIME信息,這讓我們可以確定文件的真實(shí)格式,并以此來(lái)決定最終的存儲(chǔ)擴(kuò)展名。(MIME是什么?

 

建立MIME映射字典

我們首先需要做的工作就是建立一個(gè)MIME類型到其對(duì)應(yīng)擴(kuò)展名的映射字典。

我從網(wǎng)上找來(lái)了一個(gè)MIME類型列表,并通過(guò)正則表達(dá)式將其轉(zhuǎn)換為程序代碼,粘入了程序中:

 image

這個(gè)通過(guò)正則表達(dá)式轉(zhuǎn)換而來(lái)的代碼量非常大。

需注意的是,其中有很多MIME類型相同但擴(kuò)展名不同的數(shù)據(jù),我們?cè)谔砑拥阶值鋾r(shí)就將多余的不必要記錄忽略了,比如高亮處的那三條都是audio/x-aiff類型,那么后兩個(gè)擴(kuò)展名都不會(huì)添加到字典中,也不會(huì)在后續(xù)的操作中被使用。

如果你覺(jué)得有些類型添加的對(duì)應(yīng)擴(kuò)展名不是最常見(jiàn)的對(duì)應(yīng)類型的話,就得手動(dòng)調(diào)整代碼了。(下文中就出現(xiàn)了這種情況,如text/html對(duì)應(yīng)的是dhtml擴(kuò)展名,image/jpeg對(duì)應(yīng)的是jpe擴(kuò)展名)

字典構(gòu)建完畢之后,就可以通過(guò)這樣一個(gè)方法來(lái)獲取MIME類型所對(duì)應(yīng)的擴(kuò)展名了:

 

string 獲取對(duì)應(yīng)擴(kuò)展名(string ContentType)

{

    foreach (var f in MimeDic.Keys)

    {

        if (ContentType.ToLower().IndexOf(f) >= 0) return MimeDic[f];

    }

    return null;

}

這里之所以使用IndexOf方法判斷,是因?yàn)閭魅氲腃ontentType中可能還包含其他信息,比如編碼格式。

題外話:看到網(wǎng)上曾有人抱怨說(shuō)WebClient下載網(wǎng)頁(yè)時(shí)容易產(chǎn)生亂碼,而且又不好讀取網(wǎng)頁(yè)的編碼格式,其實(shí)WebRequest的ContentType中就包含MIME和編碼格式信息:

image

 

生成下載文件路徑

現(xiàn)在有了上面的方法,我們就可以通過(guò)MIME類型確定文件的擴(kuò)展名了。

現(xiàn)在我們將書(shū)寫(xiě)一個(gè)用于生成下載文件路徑的方法,其功能為:

  1. 分析文件的源Url,將其文件名部分作為下載文件的文件名。
  2. 如果其Url中不含文件名部分(域名或目錄形式),則以其目錄名為下載文件的文件名。
  3. 根據(jù)傳入的MIME類型自動(dòng)確定并替換Url中的原始擴(kuò)展名(如果有的話),以用作下載文件的文件名。
  4. 判斷傳入的存儲(chǔ)目錄中是否已存在與下載文件名相同的文件,存在的話就進(jìn)行重命名,直到?jīng)]有同名文件為止。

功能有點(diǎn)多了,不適合做范例,不過(guò)還是很實(shí)用的,所以這里就順道分享出來(lái)。

其代碼為:

 

string 生成下載文件存放路徑(string 存放目錄, Uri Uri, string ContentType)

{

    var ex = 獲取對(duì)應(yīng)擴(kuò)展名(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

        {

            //處理常規(guī)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;

}

為了驗(yàn)證其效果,我們通過(guò)一個(gè)單元測(cè)試進(jìn)行評(píng)測(cè):

[TestMethod]

public void 文件名生成測(cè)試()

{

    var d = @"C:/Users/Public/Downloads";

    //gif格式文件,正常下載

    Assert.AreEqual(@"C:/Users/Public/Downloads/35ad5275ed17904d4a2d40f3dacea80b.gif", 生成下載文件存放路徑(d, new Uri("http://i3.6.cn/cvbnm/7c/15/a3/35ad5275ed17904d4a2d40f3dacea80b.gif"), "image/gif"));

    //url中擴(kuò)展名是gif,但MIME類型實(shí)際是image/jpeg的資源。下載后的擴(kuò)展名是jpe,因?yàn)樽值?span lang="EN-US">MimeDic存儲(chǔ)的對(duì)應(yīng)擴(kuò)展名就是jpe

    Assert.AreEqual(@"C:/Users/Public/Downloads/35ad5275ed17904d4a2d40f3dacea80b.jpe", 生成下載文件存放路徑(d, new Uri("http://i3.6.cn/cvbnm/7c/15/a3/35ad5275ed17904d4a2d40f3dacea80b.gif"), "image/jpeg"));

    //一個(gè)帶參數(shù)的網(wǎng)頁(yè)url。下載后的擴(kuò)展名是dhtml,因?yàn)樽值?span lang="EN-US">MimeDic存儲(chǔ)的對(duì)應(yīng)擴(kuò)展名就是dhtml

    Assert.AreEqual(@"C:/Users/Public/Downloads/filedownload.dhtml", 生成下載文件存放路徑(d, new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), "text/html"));

    //一個(gè)網(wǎng)頁(yè)url,其格式為目錄形式的,沒(méi)有確切文件名。

    Assert.AreEqual(@"C:/Users/Public/Downloads/g9675.dhtml", 生成下載文件存放路徑(d, new Uri("http://www.guaishow.com/u/luanfujie/g9675/"), "text/html"));

    //域名形式

    Assert.AreEqual(@"C:/Users/Public/Downloads/www.g.cn.dhtml", 生成下載文件存放路徑(d, new Uri("http://www.g.cn/"), "text/html"));

    Assert.AreEqual(@"C:/Users/Public/Downloads/g.cn.dhtml", 生成下載文件存放路徑(d, new Uri("http://g.cn"), "text/html"));

}

 

文件下載

萬(wàn)事俱備,只欠東風(fēng)了,讓我們來(lái)完成下載方法:

 

///

/// 下載文件到指定目錄,并返回下載后存放的文件路徑

///

/// 網(wǎng)址

/// 存放目錄">存放目錄,如果該目錄中已存在與待下載文件同名的文件,那么將自動(dòng)重命名

/// 下載文件存放的文件路徑

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;

}

代碼很簡(jiǎn)單,就不多說(shuō)了,我們來(lái)完成最后的測(cè)試:

[TestMethod]

public void 文件下載測(cè)試()

{

    var d = @"C:/Users/Public/Downloads";

    //首次下載

    Assert.AreEqual(@"C:/Users/Public/Downloads/filedownload.dhtml", 下載文件(new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), d));

    //第二次下載,遇到同名文件,自動(dòng)重命名

    Assert.AreEqual(@"C:/Users/Public/Downloads/filedownload(1).dhtml", 下載文件(new Uri("http://www.uushare.com/filedownload?user=icesee&id=2205188"), d));

    //下載一個(gè)原本是gif類型的文件

    Assert.AreEqual(@"C:/Users/Public/Downloads/2naqyw8.gif", 下載文件(new Uri("http://i38.tinypic.com/2naqyw8.jpg"), d));

}

結(jié)語(yǔ)

相較WebClient而言,WebRequest擁有更好的可控性,在WebClient無(wú)解的時(shí)候,就嘗試讓W(xué)ebRequest上場(chǎng)吧。

下載

范例源代碼:http://www.uushare.com/user/icesee/file/2214050

本文的XPS版本:http://www.uushare.com/user/icesee/file/2214051

NET技術(shù)下載文件時(shí)根據(jù)MIME類型自動(dòng)判斷保存文件的擴(kuò)展名,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 青草悠悠视频在线观看 | 成人综合网站 | chinese国产一区二区 | 狂野欧美性猛交xxxx巴西 | 91国内外精品自在线播放 | 久久终合 | 久久99国产精品亚洲 | 色老板免费视频 | 色美女影院 | 美女把屁股扒开让男人桶视频 | 欧美噜噜噜 | 国产精品污 | 一级a性色生活片久久毛片 一级爱爱片一级毛片-一毛 | 激情小说激情视频激情图片 | 久久综合狠狠综合狠狠 | 一本久道久久综合中文字幕 | 成人精品视频在线 | 五月婷婷开心 | 国产精品亚洲欧美一级久久精品 | 精品乱人伦一区二区三区 | 亚洲福利在线播放 | 久久久久久一级毛片免费野外 | 成人www视频 | 亚洲欧美一级久久精品 | 久热最新视频 | 精品麻豆视频 | 天天影视亚洲 | 成人午夜视频一区二区国语 | 男人让女人爽的免费视频 | 5151四虎永久在线精品免费 | 国产一区二区三区精品视频 | 国产精品亚洲第一区二区三区 | 国产成人mv在线观看入口视频 | 女人张腿给男人桶视频免费版 | 青青草伊人久久 | 精品在线第一页 | 1024香蕉视频 | 激情小说激情图片激情视频 | 天天搞天天色 | 中文字幕一区二区三区四区 | 亚洲欧美成人影院 |