最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Web Api 2實(shí)現(xiàn)多文件打包并下載文件的實(shí)例

 更新時(shí)間:2016年06月23日 10:07:53   投稿:yourber  
這篇文章主要介紹了ASP.NET Web Api 2利用ByteArrayContent和StreamContent實(shí)現(xiàn)多文件打包并下載的方法,提供源碼下載,需要的朋友可以參考下。

最近由于工作和個(gè)人事務(wù),站點(diǎn)也好久沒更新了,但這并不影響我對(duì).NET的熱情。站點(diǎn)的更新工作還是得想辦法抽時(shí)間來完成的。

今天利用中午的時(shí)間來寫一篇關(guān)于Asp.Net Web Api下載文件的文章,之前我也寫過類似的文章,請(qǐng)見:《ASP.NET(C#) Web Api通過文件流下載文件的實(shí)例

本文以這篇文章的基礎(chǔ),提供了ByteArrayContent的下載以及在下載多個(gè)文件時(shí)實(shí)現(xiàn)在服務(wù)器對(duì)多文件進(jìn)行壓縮打包后下載的功能。

關(guān)于本文中實(shí)現(xiàn)的在服務(wù)器端用.NET壓縮打包文件功能的過程中,使用到了一個(gè)第方類庫:DotNetZip,具體的使用將在正文中涉及。好了,描述了這么多前言,下面我們進(jìn)入本文示例的正文。

1.首先創(chuàng)建名為:WebApiDownload的Web Api 項(xiàng)目(C#);

2.接著新建一個(gè)空的控制器,命名為:DownloadController;

3.創(chuàng)建一些打包文件和存放臨時(shí)文件的文件夾(downloads),具體請(qǐng)看本文最后提供的示例項(xiàng)目代碼

4.打開NuGet程序包管事器,搜索DotNetZip,如下圖:

http://img.jbzj.com/file_images/article/201606/2016062309583710.png

搜索到DotNetZip安裝包后,進(jìn)行安裝,以便用于本項(xiàng)目將要實(shí)現(xiàn)多文件打包壓縮的功能,如下圖:

http://img.jbzj.com/file_images/article/201606/2016062309583711.png

安裝完成DotNetZip包后,我們就可以退出NuGet程序包管理器了,因?yàn)楸卷?xiàng)目為示例項(xiàng)目,不需再添加其他的包。

5.在Models文件夾下創(chuàng)建一個(gè)示例數(shù)據(jù)的類,名為:DemoData,其中的成員和實(shí)現(xiàn)如下:

using System.Collections.Generic;


namespace WebApiDownload.Models
{
 public class DemoData
 {
  public static readonly List<List<string>> Contacts = new List<List<string>>();
  public static readonly List<string> File1 = new List<string>
  {
   "f_1_test_1@example.com",
   "f_1_test_2@example.com",
   "f_1_test_3@example.com",
   "f_1_test_4@example.com",
   "f_1_test_5@example.com"
  };
  public static readonly List<string> File2 = new List<string>
  {
   "f_2_test_1@example.com",
   "f_2_test_2@example.com",
   "f_2_test_3@example.com",
   "f_2_test_4@example.com",
   "f_2_test_5@example.com"
  };
  public static readonly List<string> File3 = new List<string>
  {
   "f_3_test_1@example.com",
   "f_3_test_2@example.com",
   "f_3_test_3@example.com",
   "f_3_test_4@example.com",
   "f_3_test_5@example.com"
  };

  public static List<List<string>> GetMultiple
  {
   get
   {
    if (Contacts.Count <= 0)
    {
     Contacts.Add(File1);
     Contacts.Add(File2);
     Contacts.Add(File3);
    }
    return Contacts;
   }
  }
 }
}

6.到這里,我們的準(zhǔn)備工作基本做得差不多了,最后我們只需要在DownloadController控制器中實(shí)現(xiàn)兩個(gè)Action,一個(gè)為:DownloadSingle(提供下載單個(gè)文件的功能),另一個(gè)為:DownloadZip(提供打包壓縮多個(gè)文件并下載的功能)。具體的DownloadController完整代碼如下:

using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web.Http;
using Ionic.Zip;
using WebApiDownload.Models;
using System;
using System.IO;
using System.Net;
using System.Net.Http.Headers;
using System.Threading;
using System.Web;


namespace WebApiDownload.Controllers
{
 [RoutePrefix("download")]
 public class DownloadController : ApiController
 {
  [HttpGet, Route("single")]
  public HttpResponseMessage DownloadSingle()
  {
   var response = new HttpResponseMessage();
   //從List集合中獲取byte[]
   var bytes = DemoData.File1.Select(x => x + "\n").SelectMany(x => Encoding.UTF8.GetBytes(x)).ToArray();
   try
   {
    var fileName = string.Format("download_single_{0}.txt", DateTime.Now.ToString("yyyyMMddHHmmss"));
    var content = new ByteArrayContent(bytes);
    response.Content = content;
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
     FileName = fileName
    };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
   }
   catch (Exception ex)
   {
    response.StatusCode = HttpStatusCode.InternalServerError;
    response.Content = new StringContent(ex.ToString());
   }
   return response;
  }
  [HttpGet, Route("zip")]
  public HttpResponseMessage DownloadZip()
  {
   var response = new HttpResponseMessage();
   try
   {
    var zipFileName = string.Format("download_compressed_{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss"));
    var downloadDir = HttpContext.Current.Server.MapPath($"~/downloads/download");
    var archive = $"{downloadDir}/{zipFileName}";
    var temp = HttpContext.Current.Server.MapPath("~/downloads/temp");

    // 清空臨時(shí)文件夾中的所有臨時(shí)文件
    Directory.EnumerateFiles(temp).ToList().ForEach(File.Delete);
    ClearDownloadDirectory(downloadDir);
    // 生成新的臨時(shí)文件
    var counter = 1;
    foreach (var c in DemoData.GetMultiple)
    {
     var fileName = string.Format("each_file_{0}_{1}.txt", counter, DateTime.Now.ToString("yyyyMMddHHmmss"));
     if (c.Count <= 0)
     {
      continue;
     }
     var docPath = string.Format("{0}/{1}", temp, fileName);
     File.WriteAllLines(docPath, c, Encoding.UTF8);
     counter++;
    }
    Thread.Sleep(500);
    using (var zip = new ZipFile())
    {
     // Make zip file
     zip.AddDirectory(temp);
     zip.Save(archive);
    }
    response.Content = new StreamContent(new FileStream(archive, FileMode.Open, FileAccess.Read));
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = zipFileName };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
   }
   catch (Exception ex)
   {
    response.StatusCode = HttpStatusCode.InternalServerError;
    response.Content = new StringContent(ex.ToString());
   }
   return response;
  }

  private void ClearDownloadDirectory(string directory)
  {
   var files = Directory.GetFiles(directory);
   foreach (var file in files)
   {
    try
    {
     File.Delete(file);
    }
    catch
    {
    }
   }
  }
 }
}

到此,本示例的實(shí)現(xiàn)代碼部分就完成了,如果我們此時(shí)打開地址:http://localhost:63161/download/single,瀏覽器會(huì)彈出保存文件的提示窗口,如下:

http://img.jbzj.com/file_images/article/201606/2016062309583714.png

保存此文件后,打開它我們會(huì)看到我們的示例數(shù)據(jù)已被保存到本地了,如下:

http://img.jbzj.com/file_images/article/201606/2016062309583815.png

同樣的,下載壓縮文件你只需要訪問地址:localhost:63161/download/zip 即可,筆者就不再演示了。

最后,附上本示例項(xiàng)目的完整源代碼,點(diǎn)擊這里下載

以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • log4net教程日志分類和自動(dòng)維護(hù)示例

    log4net教程日志分類和自動(dòng)維護(hù)示例

    log4net能不能按照功能分類呢?如果通過配置不同的logger,然后功能根據(jù)不同的LoggerName加載Ilog實(shí)例,是可以做到。但由于這些功能的log配置差異性極小,也許僅僅就是文件名不同。于是想通過代碼進(jìn)行配置,下面把方法分享如下
    2014-01-01
  • ASP.NET中彈出消息框的幾種常見方法

    ASP.NET中彈出消息框的幾種常見方法

    這篇文章主要介紹了ASP.NET中彈出消息框的幾種常見方法,給出了幾種常見的彈出消息框的方法,并總結(jié)對(duì)比了幾種方法的特點(diǎn),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • asp.net使用jQuery Uploadify上傳附件示例

    asp.net使用jQuery Uploadify上傳附件示例

    Uploadify是JQuery的一個(gè)上傳插件,實(shí)現(xiàn)的效果非常不錯(cuò),帶進(jìn)度顯示,本文是一個(gè)簡(jiǎn)單的介紹Demo,主要是動(dòng)態(tài)傳遞參數(shù)方法,通過formdata 向處理程序傳遞額外的表單數(shù)據(jù)
    2014-01-01
  • TextBox的寬度隨輸入的文本的大小而改變的js代碼

    TextBox的寬度隨輸入的文本的大小而改變的js代碼

    TextBox的寬度隨輸入的文本的大小而改變的asp.net代碼。
    2009-09-09
  • ASP.NET Core環(huán)境設(shè)置教程(2)

    ASP.NET Core環(huán)境設(shè)置教程(2)

    這篇文章主要為大家詳細(xì)介紹了Asp.net Core環(huán)境設(shè)置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • ASP.NET MVC小結(jié)之基礎(chǔ)篇(一)

    ASP.NET MVC小結(jié)之基礎(chǔ)篇(一)

    本文是ASP.NET MVC系列的第一篇文章,跟其他學(xué)習(xí)系列一樣,咱們先來點(diǎn)基礎(chǔ)知識(shí),之后再循序漸進(jìn)。我們先從asp.net mvc的概念開始吧。
    2014-11-11
  • 一步步打造簡(jiǎn)單的MVC電商網(wǎng)站BooksStore(1)

    一步步打造簡(jiǎn)單的MVC電商網(wǎng)站BooksStore(1)

    這篇文章主要和大家一起一步步打造一個(gè)簡(jiǎn)單的MVC電商網(wǎng)站,MVC電商網(wǎng)站BooksStore第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • ASP.net WebAPI跨域調(diào)用問題的解決方法

    ASP.net WebAPI跨域調(diào)用問題的解決方法

    在做Web開發(fā)中,常常會(huì)遇到跨域的問題,到目前為止,已經(jīng)有非常多的跨域解決方案。下面這篇文章主要給大家介紹了關(guān)于ASP.net WebAPI跨域調(diào)用問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-03-03
  • ASP.NET網(wǎng)頁顯示LED字體的方法

    ASP.NET網(wǎng)頁顯示LED字體的方法

    在我們開發(fā)網(wǎng)站時(shí),或許需要顯示一些非windows或是服務(wù)器安裝的字體。在網(wǎng)站發(fā)布時(shí),我們不可能把這些字符復(fù)制于服務(wù)器上,除非你擁有管理員級(jí)權(quán)限。在條件不允許的情況,但又要顯示特殊字體時(shí),只有參考下面的方法來實(shí)現(xiàn)
    2012-10-10
  • asp.net類序列化生成xml文件實(shí)例詳解

    asp.net類序列化生成xml文件實(shí)例詳解

    這篇文章主要介紹了asp.net類序列化生成xml文件的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了asp.net序列化生成xml文件的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

开鲁县| 惠州市| 米易县| 东乌| 柏乡县| 剑阁县| 兴业县| 福建省| 锡林郭勒盟| 内乡县| 同江市| 苍溪县| 盐山县| 大渡口区| 阜南县| 迭部县| 诸城市| 伊通| 铁岭市| 香格里拉县| 巴林左旗| 内黄县| 陇西县| 金堂县| 兰坪| 怀集县| 嵩明县| 巨鹿县| 长岛县| 邵阳县| 龙陵县| 泾阳县| 科技| 乳山市| 商丘市| 三穗县| 海原县| 宁武县| 大同县| 丰原市| 开原市|