首先: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. CF 1008B Turn the Rectangles(水题+贪心)

    There are n rectangles in a row. You can either turn each rectangle by 90 degrees or leave it as it ...

  2. 按Right-BICEP要求的测试用例

    测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.结果是否有符合要求的20道题目? 5.所得到的最大数 ...

  3. 周总结<6>

    周次 学习时间 新编写代码行数 博客量(篇) 学到知识点 13 10 100 2 网页设计:邻接矩阵深度以及广度遍历

  4. c# Webservice技术整理

    因为平常项目中使用webservice比较少,然后就将本来不太熟悉的webservice给忘记掉了.所以再次整理如下: 百度搜索关键词 :c# webservice 1. 联接地址: http://w ...

  5. XML XPath语法总结

    刚刚遇到一个多重查询xmlDoc.SelectSingleNode("Root/Element[@Name='大气象'][@Age='30']")根据innerText查询xmlD ...

  6. 此时本机的BootLoader程序坏了,也就是说grub第一阶段坏掉了,该如何修复

    方法一:直接安装grub (1)先把MBR拷贝一份 dd if=/dev/sda of=/tmp/mbr count=1 bs=512   (2)然后再破坏 dd if=/dev/zero of=/d ...

  7. 这可能是目前最全的Redis高可用技术解决方案总结

    本文主要针对 Redis 常见的几种使用方式及其优缺点展开分析. 一.常见使用方式 Redis 的几种常见使用方式包括: Redis 单副本: Redis 多副本(主从): Redis Sentine ...

  8. 【UNIX环境高级编程】线程同步

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图.如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题.同样,如果变量是只读的也不会有一致性问题.但是,当一个线程可 ...

  9. 第119天:移动端:CSS像素、屏幕像素和视口的关系

    移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设备逻辑像素 )和 CSS 像素之间 ...

  10. CSS自适应导航菜单

    以下是一个简单实例,可以通过学习了解响应工菜单的制作. html <nav class="nav"> <ul> <li class="cur ...