webAPI+angularJS文件上传和下载
开发框架
前端
angularJS1.6
下载和保存文件FileSaver:https://github.com/eligrey/FileSaver.js/
后端
.net WebAPI
1 导入Excel文件关键代码
1.1 导入Excel弹出框

1.2 模态框html代码
<div class="modal fade" id="importExcelPop" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" style="width:610px;height:100px;" role="document">
<div class="modal-content">
<div class="modal-header">
<div class="modal-title">导入Excel文件</div>
</div>
<div class="modal-body">
<form class="form-horizontal" id="importExcelForm">
<div class="form-group">
<label for="import" class="col-sm-2 control-label">选择文件:</label>
<div class="col-sm-5">
<div class="form-control" type="text" name="fileName" readonly placeholder="" ng-required="isAdd" title="{{file ? file.name : ''}}">
{{file ? file.name : '' | limitString :20}}
</div>
</div>
<div class="col-sm-5">
<button type="button" type="file" ngf-select ng-model="file" accept=".xls,.xlsx" class="btn btn-not-important browse inline-div">{{'Browse' | translate }}</button>
</div>
</div>
</form>
</div>
<div class="modal-footer" style="padding-left:113px;">
<button type="button" class="btn btn-primary" ng-disabled="!file" ng-click=”upload()">导入</button>
<button type="button" class="btn btn-third" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
1.3 导入js代码
// 上传文件地址
var uploadUrl = apiInterceptor.webApiHostUrl + '/test/Upload';
// angularjs上传方法
$scope.upload = function() {if ($scope.file) {
// 选中文件
importData();
}
}; // 导入数据
var importData = function() {
if (!$scope.file || !$scope.file.name) { SweetAlert.info('请选择文件');
return;
} // $q需要注入
var deferred = $q.defer();
var tempFileName = PWC.newGuid() + '.dat';
var token = $('input[name="__RequestVerificationToken"]').val(); Upload.upload({
url: uploadUrl,
data: {
cancel: false,
filename: $scope.file.name,
},
file: $scope.file,
resumeChunkSize: resumable ? $scope.chunkSize : null,
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: apiInterceptor.tokenType + ' ' + apiInterceptor.apiToken,
__RequestVerificationToken: token,
withCredentials: true
},
__RequestVerificationToken: token,
withCredentials: true
}).then(function(resp) {
var ret = resp.data;
deferred.resolve(); }, function(resp) {
deferred.resolve(); console.log('Error status: ' + resp.statusText);
}, function(evt) {
deferred.resolve();
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
$log.debug('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});
};
1.4 webAPI的TestController方法
/// <summary>
/// Uploads this instance.
/// </summary>
/// <returns></returns>
[Route("Upload")]
[HttpPost]
public IHttpActionResult Upload() {
if (HttpContext.Current.Request.Files.Count == ) {
return this.Ok(new OperationResultDto() { Result = false, ResultMsg = Message.Error.NoFile });
} var file = HttpContext.Current.Request.Files[];
var mappedPath = HostingEnvironment.MapPath("~/Upload");
var fileFullPath = Path.Combine(mappedPath, Guid.NewGuid().ToString().ToUpper() + Path.GetFileName(file.FileName)); var saveFileResult = this.SaveFile(file, mappedPath, fileFullPath);
if (!saveFileResult.Result) {
return this.Ok(saveFileResult);
} OperationResultDto ret = new OperationResultDto();
string errorMsg = string.Empty;
Dictionary < System.Guid, string > error = new Dictionary < Guid, string > (); try {
// 读取Excel文件,自己实现
// var getImportDataResult = this.GetImportFileData(mappedPath, fileFullPath);
// if (!getImportDataResult.Result) {
// return this.Ok(getImportDataResult);
// } // 业务处理 } catch (Exception ex) {
errorMsg = ex.Message.ToString();
error.Add(System.Guid.NewGuid(), ex.StackTrace.ToString());
} finally {
File.Delete(fileFullPath);
} if (!string.IsNullOrEmpty(errorMsg)) {
ret.ResultMsg = errorMsg;
ret.Errors = error;
} return this.Ok(ret);
} /// <summary>
/// Saves the file.
/// </summary>
/// <param name="file">The file.</param>
/// <param name="mappedPath">The mapped path.</param>
/// <param name="fileFullPath">The file full path.</param>
/// <returns></returns>
private OperationResultDto SaveFile(HttpPostedFile file, string mappedPath, string fileFullPath) {
string errorMsg = string.Empty;
Dictionary < System.Guid, string > error = new Dictionary < Guid, string > ();
try {
if (Directory.Exists(mappedPath) == false) {
Directory.CreateDirectory(mappedPath);
}
file.SaveAs(fileFullPath);
} catch (Exception ex) {
errorMsg = Message.Error.SaveFileError;
error.Add(System.Guid.NewGuid(), ex.StackTrace.ToString());
}
return new OperationResultDto() { ResultMsg = errorMsg, Result = string.IsNullOrEmpty(errorMsg), Errors = error };
}
2 下载Excel关键代码
2.1 UI

2.2 html代码
<button type="button" class="btn" ng-click="down ()"> <i class="fa fa-download" aria-hidden="true"></i>下载模板</button>
2.3 js代码
Js Controller代码
$scope.down = function() {
testService. download ();
};
Js webservice方法
download: function() {
var thisConfig = apiConfig.create();
thisConfig.responseType = "arraybuffer";
return $http.post('/test/download', {}, thisConfig).then(function(response) {
var data = new Blob([response.data], { type: response.headers('Content-Type') });
// var filename1 = response.headers('Content-Disposition').split(';')[1].trim().substr('filename='.length);
var filename = 'Excel.xlsx';
// FileSaver 是一个插件
FileSaver.saveAs(data, filename);
});
}
2.4 webAPI方法
[HttpPost]
[Route("download")]
public HttpResponseMessage Download (object o) {
var filePath = HostingEnvironment.MapPath("~/downLoad/Excel.xlsx");
string customFileName = Constant.FileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; //客户端保存的文件名 FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
fileStream.CopyTo(ms);
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new ByteArrayContent(ms.ToArray());
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = customFileName;
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 这句话要告诉浏览器要下载文件
return response;
}
webAPI+angularJS文件上传和下载的更多相关文章
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 文件上传和下载(可批量上传)——Spring(三)
在文件上传和下载(可批量上传)——Spring(二)的基础上,发现了文件下载时,只有在Chrome浏览器下文件名正常显示,还有发布到服务器后,不能上传到指定的文件夹目录,如上传20160310.txt ...
- 文件上传和下载(可批量上传)——Spring(二)
针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...
- Struts2 之 实现文件上传和下载
Struts2 之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...
随机推荐
- springboot整合系列
Spring Boot 系列 博客原文:http://blog.csdn.net/isea533/article/details/50412212 Spring Boot 入门 Spring Boot ...
- intellij IDEA里各图标对应的文件类型
本篇内容为大家提供的是IntelliJ IDEA 使用教程中的常见文件类型的图标介绍,IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一, ...
- Java并发编程有多难?这几个核心技术你掌握了吗?
本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...
- 《金领简历:敲开苹果、微软、谷歌的大门》【PDF】下载
<金领简历:敲开苹果.微软.谷歌的大门>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196331 内容简介 <金领简历:敲开 ...
- 【java】io流之字符输入流:java.io.Reader类及子类的子类java.io.FileReader
package 文件操作; import java.io.File; import java.io.FileReader; import java.io.IOException; import jav ...
- Java 本地开发环境搭建(框架采用 Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6)
项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6 搭建环境文档目录结构说明: 使用Intellj Idea 搭建项目过 ...
- discuz管理员登录进入后台管理马上跳转到登录界面
昨天尝试了一下这个discuz论坛,感觉还可以.今天刚刚用管理员账户进入后台管理,准备改一改界面熟悉一下,过不了10秒钟.老是马上就退出来了.我想起来了,昨天是在阿里云服务器上面直接登录这个管理员账号 ...
- bzoj 4868: [Shoi2017]期末考试
Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...
- 嵌入式设计初体验:永远的hello,world
目前,xilinx的zynq系列FPGA炒的火热,SOC成为FPGA发展的必然趋势.可见所有功能均用硬件描述语言设计是不科学的.硬件逻辑独有的并行性使其在实时处理和并行算法中占尽优势,但当执行串行操作 ...
- lesson - 5 Linux用户和组管理
1. /etc/passwd由 : 分隔成7个字段(1) 用户名 规则:大小写字母.数字.减号(不能出现在首位).点以及下划线,其他字符不合法 (2) x 放密码,安全起见放到 /etc/shadow ...