ASP.NET MVC实现Excel文件的上传下载
在应用系统开发当中,文件的上传和下载是非常普遍的需求。在基于.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部分代码:
<script type="text/javascript">
var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../../";
var GUID = WebUploader.Base.guid();
$(function () {
var $ = jQuery;
var $list = $('#thelist');
var uploader = WebUploader.create({
auto: false, // 是否自动上传
swf: applicationPath + '../Scripts/webuploader/Uploader.swf', //server: applicationPath + 'DAManage/Upload',
server: '@Url.Action("Upload", "Test")',
pick: '#picker',
accept: {
title: 'Excels',
extensions: 'xls,xlsx',
mimeTypes: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
},
chunked: true, //分片上传
chunkSize: 2048000, //每一片的大小
formData: {
guid: GUID
},
resize: false //不压缩image
}); //添加进上传文件队列
uploader.on('fileQueued', function (file) {
$list.append('<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上传...</p>' +
'</div>');
}); //开始上传
$("#ctlBtn").click(function () {
uploader.upload();
}); //上传进度
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .progress-bar'); // 避免重复创建
if (!$percent.length) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo($li).find('.progress-bar');
}
$li.find('p.state').text('上传中');
$percent.css('width', percentage * 100 + '%');
}); //上传成功
uploader.on('uploadSuccess', function (file, response) {
$('#' + file.id).find('p.state').text('已上传');
$.post('@Url.Action("Merge", "Test")', { guid: GUID, fileName: file.name }, function (data) {
$("#uploader .state").html("上传成功...");
uploader.removeFile(file);
});
}); // 上传失败
uploader.on('uploadError', function (file) {
$('#' + file.id).find('p.state').text('上传出错');
}); //上传完成后
uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').fadeOut();
}); //上传完毕
uploader.on("uploadFinished", function () {
uploader.reset();
});
});
</script>
上面我给出了基本的注释,想要获取参数的详细定义和说明,请参考:http://fex.baidu.com/webuploader/doc/index.html。
后端控制器部分代码,主要是上面js中所指向的两个Action,分别为Upload和Merge。
Upload部分代码:
/// <summary>
/// 上传Excel
/// </summary>
/// <returns>1表示失败,0表示成功</returns>
[HttpPost]
public ActionResult Upload()
{
var fileName = Request["name"];
var fileRelName = fileName.Substring(, 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 = });
}
return Json(new { erron = });
}
Merge部分代码:
/// <summary>
/// 合并Excel成功后,将其数据导入数据库
/// </summary>
/// <returns>1表示失败,0表示成功</returns>
public ActionResult Merge()
{
var uploadDir = Server.MapPath("~/Upload");
var fileName = Request["fileName"];
var fileRelName = fileName.Substring(, 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, , 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 = });
}
return Json(new { error = });
}
WebUploader是基于分块上传(这个设计主要针对大文件的上传)的,所以后端的处理也是分块合并的。Merge中的Excel2DB方法是将上传到服务器的Excel文件中的数据保存到数据库的方法,其中涉及Excel文件内容的读取(NPOI,支持xls和xlsx类型)和EF(5.0)实现数据的保存(保存到SQLServer)。具体的代码可以参考本篇博客最后的示例代码下载。
而关于文件的下载,其实ASP.NET MVC已经提供了FileResult类型,只需要返回File对象就可以了,具体的Action代码如下:
/// <summary>
/// 下载excel
/// </summary>
/// <returns></returns>
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
ASP.NET MVC实现Excel文件的上传下载的更多相关文章
- ASP.NET MVC WebAPI实现文件批量上传
工作中学习,学习中记录~~~~~~ 最下面附上demo 任务需求:需要做一个apI接口让C#的程序调用实现批量文件的上传. 难度: 没有做过通过API上传文件的...之前做过网站前后台上传. 首先当然 ...
- asp.net mvc+webuploader大文件分片上传
首先是前端: var GUID = WebUploader.Base.guid();//一个GUID uploadereditsVideo = WebUploader.create({ // swf文 ...
- Spring实现文件的上传下载
背景:之前一直做的是数据库的增删改查工作,对于文件的上传下载比较排斥,今天研究了下具体的实现,发现其实是很简单.此处不仅要实现单文件的上传,还要实现多文件的上传. 单文件的下载知道了,多文件的下载呢? ...
- 在Window的IIS中创建FTP的Site并用C#进行文件的上传下载
文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服务器计算机上. 然后,远程计算机可以使用 FTP ...
- 创建FTP的Site并用C#进行文件的上传下载
创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...
- linux链接及文件互相上传下载
若排版紊乱可查看我的个人博客原文地址 基本操作 本篇博客主要介绍如何去链接远程的linux主机及如何实现本地与远程主机之间文件的上传下载操作,下面的linux系统是CentOS6.6 链接远程linu ...
- SocketIo+SpringMvc实现文件的上传下载
SocketIo+SpringMvc实现文件的上传下载 socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: GIT地址 ...
- JAVAWEB之文件的上传下载
文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...
- SSM框架之中如何进行文件的上传下载
SSM框架的整合请看我之前的博客:http://www.cnblogs.com/1314wamm/p/6834266.html 现在我们先看如何编写文件的上传下载:你先看你的pom.xml中是否有文件 ...
随机推荐
- CSS_常见布局
1.一列布局——常用于网站首页. html: <div class="top"></div> <div class="main"& ...
- javascript中的常用表单事件用法
下面介绍几种javascript中常用的表单事件: 一,onsubmit:表单中的确认按钮被点击时发生的事件,如下案例. 案例解析:弹出表单中提交的内容 <form name="tes ...
- 实验楼-高级Bash脚本编程指南
实验1.Bash介绍与入门 1.简介:Bash是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝 ...
- 细说python类2——类动态添加方法和slots(转)
先说一下类添加属性方法和实例添加属性和方法的区别, 类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性.给类加一个方法也如此,以后类的每一个实例化都具备 ...
- Centos PHP+Apache执行exec()等Linux脚本权限设置的详细步骤
1. 查看一下你的Apache的执行用户是谁: lsof -i:80 运行之后的结果为: 从图中我们可以清楚的看到,httpd(也就是Apache)的执行用户为:exec_shell( ...
- Guava-Objects使用
前言 Java中的Object提供了很多方法供所有的类使用,特别是toString.hashCode.equals.getClass等方法,在日常开发中作用很大,Guava中包含Objects类,其提 ...
- MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERT IGNORE时发现, 即使INSERT未成功执行, 表的自增主键却自动加1了, 在某些情况下需要避免这种行为. 需要修改的变量是 innodb_autoinc_lo ...
- Laravel: 基础篇
一.安装 1)采用一键安装包 http://laravelacademy.org/resources-download 2)Mac 上安装 ----------在Mac上安装composer----- ...
- R语言︱处理缺失数据&&异常值检验、离群点分析、异常值处理
在数据挖掘的过程中,数据预处理占到了整个过程的60% 脏数据:指一般不符合要求,以及不能直接进行相应分析的数据 脏数据包括:缺失值.异常值.不一致的值.重复数据及含有特殊符号(如#.¥.*)的数据 数 ...
- Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...