AngularJS向后端ASP.NET API控制器上传文件


Posted in Javascript onFebruary 03, 2016

本文实例介绍了前端AngularJS向后端ASP.NET Web API上传文件的实现方法,具体内容如下

首先服务端:

public class FilesController : ApiController
{
  //using System.Web.Http
  [HttpPost]
  public async Task<HttpResponseMessage> Upload()
  {
    if(!Request.Content.IsMimeMultipartContent())
    {
      this.Request.CreateResponse(HttpStatusCode.UnsuportedMediaType);
    }
    
    var provider = GetMultipartProvider();
    var result = await Request.Content.ReadAsMultipartAsync(provider);
    
    //文件名类似"BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5"这样的格式
    var originalFileName = GetDeserializedFileName(result.FileData.First());
    
    var uploadFileInfo = new FileInfo(result.FileData.First().LocalFileName);
    
    //如果前端无表单数据,这里注销
    var filleUploadObj = GetFormData<UploadDataModel>(result);
    
    var returnData = "ReturnTest";
    return this.Request.CreateResponse(HttpStatusCode.OK, new {returnData});
  }
  
  private MultipartFormDataStreamProvider GetMultipartProvider()
  {
    //图片的上传路径
    var uploadFolder = "~/App_Data/FileUploads";
    
    //获取根路径
    var root = HttpContext.Current.Server.MapPath(uploadFolder);
    
    //创建文件夹
    Directory.CreateDirectory(root);
    return new MultipartFormDataStreamProvider(root);
  }
  
  //从Provider中获取表单数据
  private object GetFormData<T>(MultipartFormDataStreamProvider result)
  {
    if(result.FormData.HasKeys())
    {
      var unescapedFormData = Uri.UnescapeDataString(result.FormData.GetValues(0).FirstOrDefault() ?? String.Empty);
      
      if(!String.IsNullOrEmpty(unescapedFormData))
      {
        return JsonConvert.DeserializeObject<T>(upescapedFormData);
      }
    }
    return null;
  }
  
  //获取反序列化文件名
  private string GetDeserializedFileName(MultipartFileData fileData)
  {
    var fileName = GetFileName(fileData);
    return JsonConvert.DeserializedObject(fileName).ToString();
  }
  
  //获取文件名
  public string GetFileName(MultipartFileData fileData)
  {
    return fileData.Headers.ContentDisposition.FileName;
  }
}

UploadDataModel.cs

public class UploadDataModel
{
  public string testString1{get;set;}
  public string testString2{get;set;}
}

客户端主页面:

index.html

<div ng-include="'upload.html'"></div>

引用:

  • angular-file-upload-shim.js
  • angular.js
  • angular-file-upload.js
  • angular-cookies.js
  • angular-resource.js
  • angular-sanitize.js
  • angular-route.js
  • app.js
  • upload.js

upload.html部分视图页用来接受文件。

upload.html

<div ng-controller="UploadCtrl"
  <input type="file" ng-file-select="onFileSelect($files)" multiple>
</div>

app.js模块依赖和全局配置。

app.js

'use strict'

angular.module('angularUploadApp',[
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute',
  'angularFileUpload'
])
.config(function($routeProvider){
  $routeProvider
    .when('/', {
      templateUrl: 'upload.html',
      controller: 'UploadCtrl'
    })
    .otherwise({
      resirectTo: '/'
    })
})

控制器提供上传和取消上传的方法。

upload.js

'use strict';

angular.module('angularUploadApp')
  .controller('UploadCtrl', function($scope, $http, $timeout, $upload){
    $scope.upload = [];
    $scope.fileUploadObj = {testString1: "Test ring 1", testString2: "Test string 2"};
    
    $scope.onFileSelect = function ($files) {
      //$files: an array of files selected, each file has name, size, and type.
      for (var i = 0; i < $files.length; i++) {
        var $file = $files[i];
        (function (index) {
          $scope.upload[index] = $upload.upload({
            url: "./api/files/upload", // webapi url
            method: "POST",
            data: { fileUploadObj: $scope.fileUploadObj },
            file: $file
          }).progress(function (evt) {
            // get upload percentage
            console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
          }).success(function (data, status, headers, config) {
            // file is uploaded successfully
            console.log(data);
          }).error(function (data, status, headers, config) {
            // file failed to upload
            console.log(data);
          });
        })(i);
      }
    }

    $scope.abortUpload = function (index) {
      $scope.upload[index].abort();
    }
  })

以上就是前端AngularJS向后端ASP.NET Web API上传文件的实现方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
js 异步处理进度条
Apr 01 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
axios 封装上传文件的请求方法
Sep 26 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
使用apifm-wxapi模块中的问题及解决方法
Aug 05 Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 #Javascript
javascript鼠标右键菜单自定义效果
Dec 08 #Javascript
JavaScript获取当前运行脚本文件所在目录的方法
Feb 03 #Javascript
JavaScript获取对象在页面中位置坐标的方法
Feb 03 #Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 #Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 #Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 #Javascript
You might like
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
python使用pil生成缩略图的方法
2015/03/26 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
详解爬虫被封的问题
2019/04/23 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
森林防火工作方案
2014/02/14 职场文书
交通事故委托书范本
2014/09/28 职场文书
暑期社会实践证明书
2014/11/17 职场文书
期末复习计划
2015/01/19 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
心灵点滴观后感
2015/06/02 职场文书
创业计划书详解
2019/07/19 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL