首先:angular-file-upload 是一款轻量级的 AngularJS 文件上传工具,为不支持浏览器的 FileAPI polyfill 设计,使用 HTML5 直接进行文件上传。

第一步:引用angularjs的脚本:ng-file-upload-shim.min.js 和 ng-file-upload.min.js

第二步:在angularjs的controller中注入:ngFileUpload

例如:angular.module('liaoyuan.controllers', ['ui.bootstrap', 'ngFileUpload', 'ng.ueditor']);

第三部:写代码

一、上传

1、前台的html代码

  <form>
<!-- <input class="form-control update-input" ngf-select type="file" ng-model="file" name="file" readonly="readonly" /> -->
<div class="content">
<label class="update-label">请选择上传的文件位置:</label> <input class="filename" type="text" readonly="readonly" />
<a href="javascript:;" class="file-a" name="file">
<input class="file" ngf-select type="file" ng-model="file" name="file" readonly="readonly" />浏览...
</a>
</div>
<button type="button" class="btn btn-primary update-button" style="" ng-click="submit()">
上传
</button>
<script type="text/javascript">
var file = $('.file'),
aim = $('.filename');
file.on('change', function( e ){
var name = e.currentTarget.files[0].name;
aim.val( name );
});
</script>
</form>

2、angularjs 控制器Controller中的代码

 app.controller('FileController', function ($scope, $uibModalInstance, Upload) {
//取消
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
};
//上传按钮
$scope.submit = function () {
$scope.upload($scope.file);
}; $scope.upload = function (file) {
$scope.fileInfo = file;
Upload.upload({
//服务端接收
method: 'POST',
url: 'http://localhost:56897/api/serviceLogAttachments',
file: file
}).progress(function (evt) {
//进度条
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
console.log('progess:' + progressPercentage + '%' + evt.config.file.name);
}).success(function (newAttachment) {
//上传成功
$uibModalInstance.close(newAttachment);
}).error(function (data, status, headers, config) {
//上传失败
console.log('error status: ' + status);
});
}; });

注意:Upload一定要注入

3、后台上传代码

 [HttpPost]
public IHttpActionResult PostAttachment()
{
int logId = ;
HttpContext.Current.Response.ContentType = "application/json";
HttpFileCollection files = HttpContext.Current.Request.Files;
HttpRequestMessage h = new HttpRequestMessage();
var file = files[];
string fileExt = Path.GetExtension(file.FileName); string attachmentName = file.FileName.Substring(, file.FileName.LastIndexOf(".")); string fileNewName = attachmentName + DateTime.Now.ToString("yyyyMMddHHmmssfff")+ fileExt; string strRelativeDir = "/Upload/服务管理/日志详情附件/"; string fliePath = HttpContext.Current.Request.MapPath(strRelativeDir);
if (!Directory.Exists(fliePath))
{
Directory.CreateDirectory(fliePath);
}
string strSavePath = Path.Combine(fliePath, fileNewName);
file.SaveAs(strSavePath);
//插入数据库
ServiceLogAttachmentService.AddAttachment(attachment);
return CreatedAtRoute("DefaultApi", new{id = attachment.AttachmentID}, attachment);
}

二、下载

1、前台下载代码

方法一:直接访问后台数据(但此方法在前后台有授权与验证的时候,会不方便)

  //附件下载
$scope.fileDown = function (url, name) {
window.location.href = "http://localhost:56888/api/ServiceStateChanges?url=" + url + "&fileName=" + name;
}

方法二:在请求数据时在header上加上验证的token

  //附件下载
$scope.fileDown = function (url, name) {
var xhr = new XMLHttpRequest();
xhr.responseType = "blob"; xhr.open("GET", "http://localhost:56888/api/ServiceStateChanges?url=" + url + "&filename=" + name + "", true); xhr.setRequestHeader("Authorization", 'Bearer ' + currUser.token); xhr.onreadystatechange = function (e) {
if (this.readyState == 4) {
var response = this.response;
var URL = window.URL || window.webkitURL || window;
var link = document.createElement('a');
link.href = URL.createObjectURL(response);
link.download = name;
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(event);
}
}
xhr.send(null);
}

2、后台下载代码

  public HttpResponseMessage GetFile(string url,string fileName)
{
try
{
var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/"+ url);
System.IO.FileStream stream=null;
stream = new FileStream(FilePath, FileMode.Open);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName
};
return response;
}
catch
{
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
}

注:仅个人理解及笔记,有误的地方请各位大神指正!

AngularJs附件上传下载的更多相关文章

  1. java附件上传下载磁盘版

    ACTION public class UploadAction extends BaseAction { private static final long serialVersionUID = 1 ...

  2. java附件上传下载大字段版

    public int up2(Map map) { StringBuffer insertSQL = new StringBuffer(); insertSQL.append("insert ...

  3. EBS开发附件上传和下载功能

    上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统管理员文档:二是通过PL/SQL Gate ...

  4. EBS开发附件上传和下载功能(转)

    原文地址: EBS开发附件上传和下载功能 上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统 ...

  5. java 附件上传、下载前后端代码

    前言:业务需要:附件上传,需要同时满足浏览器上传,和APP上传附件,并且浏览器端不可使用form表单提交,因为表单提交无法直接获取返回值,除非刷新页面才可显示上传的附件.所以此处使用ajaxfileu ...

  6. angularjs + springmvc 上传和下载

    jsp: <form ng-submit="uploadFile()" class="form-horizontal" enctype="mul ...

  7. 百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程之更改图片和附件上传路径

    本文是接上一篇博客,如果有疑问请先阅读上一篇:百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程 默认UEditor上传图片的路径是,编辑器包目录里面的net目录下 下面就演示如 ...

  8. Webwork 学习之路【07】文件上传下载

    Web上传和下载应该是很普遍的一个需求,无论是小型网站还是大并发访问的交易网站.WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺 ...

  9. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

随机推荐

  1. "助成"招聘网站视频简介

    我们小组为我们的作品录制了一个一分多钟的电梯介绍视频,这是视频连接,我上传到了优酷上:http://v.youku.com/v_show/id_XMzIzMTc1ODc2NA==.html?spm=a ...

  2. 《JavaScript设计模式与开发实践》——第3章 闭包和高阶函数

    闭包 变量的作用域和生存周期密切相关 高阶函数 函数可以作为参数被传递 函数可以作为返回值输出

  3. JAVA之路(一)

    距离做下复习JAVA并学好JAVA的决定已经过去一周了,我买了慕课网的JAVA入门视频,在图书馆借了三本关于JAVA的书——两本是JAVA入门经典,一本是JAVA WEB开发宝典.我的计划是短时间内复 ...

  4. spring-test与junit

    1.添加依赖 spring-test junit spring-context(自动添加依赖其他所需的spring依赖包) 2.在class前添加以下注解,用于配置xml文件的位置 @RunWith( ...

  5. PAT 甲级 1035 Password

    https://pintia.cn/problem-sets/994805342720868352/problems/994805454989803520 To prepare for PAT, th ...

  6. PAT 甲级 1050 String Subtraction

    https://pintia.cn/problem-sets/994805342720868352/problems/994805429018673152 Given two strings S~1~ ...

  7. Robot 模拟操作键盘 实现复制粘贴功能;

    1.代码逻辑 : a.封装一个粘贴的方法体:setAndctrlVClipboardData(String string);参数string是需要粘贴的内容 : b.声明一个StringSelecti ...

  8. oracle 查询优化及sql改写

    ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...

  9. (十)Jmeter中的Debug Sampler介绍

    一.Debug Sampler介绍: 使用Jmeter开发脚本时,难免需要调试,这时可以使用Jmeter的Debug Sampler,它有三个选项:JMeter properties,JMeter v ...

  10. javascript之彻底理解valueOf, toString

    参与运算的都是简单类型(一般就字符串和数字), 复杂类型是不参与运算的. ***当对象(非简单类型)用作键时,会先调用toString()方法把对象转化成字符串 var a = {},     b = ...