热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NETMVC实现Excel文件的上传下载以及Excel数据的保存

在应用系统开发当中,文件的上传和下载是非常普遍的需求。在基于.NET的CS架构的项目开发当中,有多种方案可以实现文件的上传和下载(httpwebrequest、webclient等),而且多采用异步

在应用系统开发当中,文件的上传和下载是非常普遍的需求。在基于.NET的C/S架构的项目开发当中,有多种方案可以实现文件的上传和下载(httpwebrequest、webclient等),而且多采用异步(xxxxAsync或async/await等)的方式实现。而在基于.NET的B/S架构的项目开发当中,虽然webform提供了上传控件(HttpPostFile),但用户体验并不好(页面刷新,如果上传大文件则卡死,即不支持分块上传),虽然有基于Flash的上传文件的解决方案,但Flash已经过时(安全性差)。因此我们一般采用基于h5+js的上传文件插件的解决方案。本文介绍的是使用WebUploader控件结合ASP.NET MVC实现文件的上传、下载以及上传成功后将Excel数据保存到SQL Server数据库中的功能。

关于WebUploader的介绍,读者可以去查看官方网页 http://fex.baidu.com/webuploader/,跟ECharts一样,这也是百度开发的基于h5+js的开源上传文件插件。官网上面也有详细的使用介绍,基本上是介绍了js前端的配置和关键代码,但后端代码并没有提供,需要读者自行实现。

在ASP.NET MVC4中使用WebUploader只需要导入开发包中的js和css文件就可以了。比如:

 <link href="@Url.Content("~/Scripts/webuploader/webuploader.css")" rel="stylesheet" type="text/css" />
 <link href="@Url.Content("~/Scripts/webuploader/bootstrap.css")" rel="stylesheet" type="text/css" />
 <link href="@Url.Content("~/Scripts/webuploader/style.css")" rel="stylesheet" type="text/css" />
 <script src="@Url.Content("~/Scripts/webuploader/jquery-1.10.2.min.js")" type="text/Javascript">script>
 <script src="@Url.Content("~/Scripts/webuploader/bootstrap.js")" type="text/Javascript">script>
 <script src="@Url.Content("~/Scripts/webuploader/webuploader.js")" type="text/Javascript">script>

然后是Html部分:

 <div id="uploader">
     <div id="thelist" class="uploader-list">div>
     <div class="btns">
         <div id="picker">选择文件div>
         <input id="ctlBtn" type="button" value="开始上传" class="btn btn-default" />
         @Html.ActionLink("下载Excel", "DownLoad", null, new { @class = "btn btn-default" })
     div>
 div>

这里面的id和class都是webuploader默认为我们提供的,后面的btn-default则是bootstrap为我们提供的。

关键的就是js部分代码:

 

上面我给出了基本的注释,想要获取参数的详细定义和说明,请参考:http://fex.baidu.com/webuploader/doc/index.html。

后端控制器部分代码,主要是上面js中所指向的两个Action,分别为Upload和Merge。

Upload部分代码:

/// 
/// 上传Excel
/// 
/// 1表示失败,0表示成功
[HttpPost]
public ActionResult Upload()
{
    var fileName = Request["name"];
    var fileRelName = fileName.Substring(0, fileName.LastIndexOf('.'));
    int index = Convert.ToInt32(Request["chunk"]);
    var dir = Server.MapPath("~/Upload");
    dir = Path.Combine(dir, fileRelName);
    if (!System.IO.Directory.Exists(dir))
        System.IO.Directory.CreateDirectory(dir);

    try
    {
        string filePath = Path.Combine(dir, index.ToString());
        var data = Request.Files["file"];
        data.SaveAs(filePath);
    }
    catch (Exception)
    {
        return Json(new { error = 1 });
    }
    return Json(new { erron = 0 });
}

Merge部分代码:

/// 
/// 合并Excel成功后,将其数据导入数据库
/// 
/// 1表示失败,0表示成功
public ActionResult Merge()
{
    var uploadDir = Server.MapPath("~/Upload");
    var fileName = Request["fileName"];
    var fileRelName = fileName.Substring(0, fileName.LastIndexOf('.'));
    var dir = Path.Combine(uploadDir, fileRelName);//临时文件夹          
    var files = System.IO.Directory.GetFiles(dir);
    var finalPath = Path.Combine(uploadDir, fileName);
    var fs = new FileStream(finalPath, FileMode.Create);
    foreach (var part in files.OrderBy(x => x.Length).ThenBy(x => x))//排一下序,保证从0-N块写入
    {
        var bytes = System.IO.File.ReadAllBytes(part);
        fs.Write(bytes, 0, bytes.Length);
        System.IO.File.Delete(part);//删除分块
    }
    fs.Flush();
    fs.Close();
    System.IO.Directory.Delete(dir);//删除文件夹

    try
    {
        //读取上传的Excel并保存到数据库
        DbHelper.Excel2DB(finalPath, "Sheet1");
    }
    catch (Exception)
    {
        return Json(new { error = 1 });
    }
    return Json(new { error = 0 });
}

WebUploader是基于分块上传(这个设计主要针对大文件的上传)的,所以后端的处理也是分块合并的。Merge中的Excel2DB方法是将上传到服务器的Excel文件中的数据保存到数据库的方法,其中涉及Excel文件内容的读取(NPOI,支持xls和xlsx类型)和EF(5.0)实现数据的保存(保存到SQLServer)。具体的代码可以参考本篇博客最后的示例代码下载。

而关于文件的下载,其实ASP.NET MVC已经提供了FileResult类型,只需要返回File对象就可以了,具体的Action代码如下:

 /// 
 /// 下载excel
 /// 
 /// 
 public FileResult DownLoad()
 {
     var path = Server.MapPath("~/Upload/");
     var file = System.IO.Directory.GetFiles(path).OrderByDescending(t => new FileInfo(t).CreationTime).FirstOrDefault();
     return File(file, "application/vnd.ms-excel", new FileInfo(file).Name);
 }

File对应的第二个参数是Content-Type,由于这里要下载Excel,所以用了application/vnd.ms-excel。关于如何确定各种文件类型的Content-Type可以查看这个网址里的内容:http://tool.oschina.net/commons。

对应的前端代码上面已经贴过了,代码如下:

@Html.ActionLink("下载Excel", "DownLoad", null, new { @class = "btn btn-default" })

 

代码下载地址:https://pan.baidu.com/s/1pMbK0e3


推荐阅读
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • PGXC中的两阶段提交机制及其对事务一致性的保障
    PGXC作为一款基于PostgreSQL的分布式数据库系统,利用Sharding技术将数据分散存储于多个数据库实例中。本文探讨了PGXC的两阶段提交过程及其实现事务强一致性的方法。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • mysql 授权!!
    为什么80%的码农都做不了架构师?MySQL的权限系统围绕着两个概念:认证-确定用户是否允许连接数据库服务器授权-确定用户是否拥有足够的权限执 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
author-avatar
wiggin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有