首先: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. C++ map 遍历

    #include <iostream> #include <map> using namespace std; int main(){ map<int,int> m ...

  2. Android开发第二阶段(5)

    今天:对图片的替换修改,使整个app的图案化更美观. 明天:对Android的对sdcard的操作学习

  3. 404 Note Found -(课堂实战)- 项目UML设计(团队)

    目录 团队信息 分工选择 课上分工 课下分工 ToDolist alpha版本要做的事情 燃尽图 UML 用例图 状态图 活动图 类图 部署图 实例图 对象图 时序图 包图 通信图 贡献分评定 课上贡 ...

  4. android入门 — Activity生命周期

    Activity总共有7个回调方法,代表着不同的生命周期的环节. 1.onCreate() 在活动第一次被创建的时候调用.在这个方法中需要完成活动的初始化操作,比如说加载布局.绑定事件等. 2.onS ...

  5. MDL详解

    以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西.以下的“未分页”指没有为页进行编码. 以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体) typedef st ...

  6. EF 联合查询

    EF 文章表和标签表联合查询标签id在dis中的文章,还不知道性能如何 var query = tagRepo.Entities.Include("Tags").Where(t = ...

  7. 结对编程--fault,error,failure的程序设计

    一.结对编程内容: 1.不能触发Fault. 2.触发Fault,但是不触发Error. 3.触发Error,但不触发Failure. 二.结对编程人员 1.周浩,周宗耀 2.结对截图: 三.结对项目 ...

  8. Java实现Websocket

    Websocket介绍 在一个 WebSocket应用中, 服务器发布一个 WebSocket端点, 客户端使用这个端点的URI来连接服务器.建立连接之后,websocket协议是对称的;客户端和服务 ...

  9. BZOJ3747 POI2015Kinoman(线段树)

    考虑固定左端点,求出该情况下能获得的最大值.于是每次可以在某数第一次出现的位置加上其价值,第二次出现的位置减掉其价值,查询前缀最大值就可以了.每次移动左端点在线段树上更新即可. #include< ...

  10. 《转》理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...