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 相关文章推荐
javascript 表单规则集合对象
Jul 21 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
javascript 处理null及null值示例
Jun 09 Javascript
jQuery获取iframe的document对象的方法
Oct 10 Javascript
Jquery实现仿腾讯微博发表广播
Nov 17 Javascript
JQuery仿小米手机抢购页面倒计时效果
Dec 16 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
JS函数定义方式的区别介绍
Mar 22 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
Mar 08 Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
JS实现数组删除指定元素功能示例
Jun 05 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
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
JavaScript DOM基础
2015/04/13 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
Python中的exec、eval使用实例
2014/09/23 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
django 消息框架 message使用详解
2019/07/22 Python
python通过http下载文件的方法详解
2019/07/26 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
《美丽的黄昏》教学反思
2014/02/28 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
毕业寄语大全
2014/04/09 职场文书
目标管理责任书
2014/04/15 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
清明节寄语2015
2015/03/23 职场文书
单位综合评价意见
2015/06/05 职场文书
2015年暑假工作总结
2015/07/13 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Python入门学习之类的相关知识总结
2021/05/25 Python
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android