• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET Web Api 2实现多文件打包并下载文件的实例

ASP.NET Web Api 2实现多文件打包并下载文件的实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了精通asp.net web api,web程序设计asp.net,vs2010 asp.net web,简述asp.net的web窗体,c asp.net实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

最近由于工作和个人事务,站点也好久没更新了,但这并不影响我对.NET的热情。站点的更新工作还是得想办法抽时间来完成的。

今天利用中午的时间来写一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:《ASP.NET(C#) Web Api通过文件流下载文件的实例》

本文以这篇文章的基础,提供了ByteArrayContent的下载以及在下载多个文件时实现在服务器对多文件进行压缩打包后下载的功能。

关于本文中实现的在服务器端用.NET压缩打包文件功能的过程中,使用到了一个第方类库:DotNetZip,具体的使用将在正文中涉及。好了,描述了这么多前言,下面我们进入本文示例的正文。

1.首先创建名为:WebApiDownload的Web Api 项目(C#);

2.接着新建一个空的控制器,命名为:DownloadController;

3.创建一些打包文件和存放临时文件的文件夹(downloads),具体请看本文最后提供的示例项目代码

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

http://files.weikejianghu.com/file_images/article/201606/2016062309583710.png

搜索到DotNetZip安装包后,进行安装,以便用于本项目将要实现多文件打包压缩的功能,如下图:

http://files.weikejianghu.com/file_images/article/201606/2016062309583711.png

安装完成DotNetZip包后,我们就可以退出NuGet程序包管理器了,因为本项目为示例项目,不需再添加其他的包。

5.在Models文件夹下创建一个示例数据的类,名为:DemoData,其中的成员和实现如下:

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;
   }
  }
 }
}

</div>

6.到这里,我们的准备工作基本做得差不多了,最后我们只需要在DownloadController控制器中实现两个Action,一个为:DownloadSingle(提供下载单个文件的功能),另一个为:DownloadZip(提供打包压缩多个文件并下载的功能)。具体的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");

    // 清空临时文件夹中的所有临时文件
    Directory.EnumerateFiles(temp).ToList().ForEach(File.Delete);
    ClearDownloadDirectory(downloadDir);
    // 生成新的临时文件
    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
    {
    }
   }
  }
 }
}

</div>

到此,本示例的实现代码部分就完成了,如果我们此时打开地址:http://localhost:63161/download/single,浏览器会弹出保存文件的提示窗口,如下:

http://files.weikejianghu.com/file_images/article/201606/2016062309583714.png

保存此文件后,打开它我们会看到我们的示例数据已被保存到本地了,如下:

http://files.weikejianghu.com/file_images/article/201606/2016062309583815.png

同样的,下载压缩文件你只需要访问地址:localhost:63161/download/zip 即可,笔者就不再演示了。

最后,附上本示例项目的完整源代码,点击这里下载。

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ASP.NET core Web中使用appsettings.json配置文件的方法
  • 详解ASP.NET WEB API 之属性路由
  • ASP.NET webUploader上传大视频文件相关web.config配置
  • asp.net web页面自定义分页控件使用详解
  • ASP.NET Web.config配置文件详解
  • ASP.NET web.config 配置节点详解
  • ASP.NET Web Api 2实现多文件打包并下载文件的实例
  • ASP.NET web.config中 数据库连接字符串加密解密
  • 在ASP.NET 2.0中操作数据之五十三:在Data Web控件显示二进制数据
  • asp.net基于Web Service实现远程上传图片的方法

相关文章

  • 2017-05-11asp.net FindControl方法误区和解析
  • 2018-08-20.NET Core系列之MemoryCache 缓存域
  • 2017-05-11用DataReader还是DataSet?
  • 2017-05-11.net客户端导出Excel实现代码及注意事项
  • 2017-05-11Cookies的各方面知识(基础/高级)深度了解
  • 2017-05-11Opencv2.4.13与Visual Studio2013环境搭建配置教程
  • 2017-05-11.NET 2.0获取配置文件AppSettings和ConnectionStrings节数据的方法
  • 2017-05-11asp.net 读取文本文件并插入数据库的实现代码
  • 2017-05-11如何创建一个AJAXControlToolKit的扩展控件
  • 2017-05-11asp.net页面防止重复提交示例分享

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • GridView_RowUpdating取不到新值的解决方法
    • WebForm获取checkbox选中的值(几个简单的示例)
    • C#后台调用前台javascript的五种方法小结
    • ASP.NET 窗体间传值的方法
    • ASP.NET MVC重写RazorViewEngine实现多主题切换
    • ASP.NET实现单点登陆(SSO)适用于多种情况
    • c#.net全站防止SQL注入类的代码
    • ASP.net与SQLite数据库通过js和ashx交互(连接和操作)
    • asp.net AjaxControlToolKit--TabContainer控件的介绍
    • APS.NET MVC4生成二维码简单解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有