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 构造函数 面相对象学习必备知识
Jun 09 Javascript
nullJavascript中创建对象的五种方法实例
May 07 Javascript
详细探究ES6之Proxy代理
Jul 22 Javascript
jQuery ready()和onload的加载耗时分析
Sep 08 Javascript
基于Node.js的WebSocket通信实现
Mar 11 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
VueJS实现用户管理系统
May 29 Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 28 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入库和出库
2013/06/25 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
php分页示例分享
2014/04/30 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
js图片上传的封装代码
2017/08/01 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
Python类的专用方法实例分析
2015/01/09 Python
实用自动化运维Python脚本分享
2018/06/04 Python
python计算两个数的百分比方法
2018/06/29 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
品学兼优的大学生自我评价
2013/09/20 职场文书
校长先进事迹材料
2014/02/01 职场文书
销售队伍口号
2014/06/11 职场文书
大学迎新标语
2014/06/26 职场文书
文员岗位职责范本
2015/04/16 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL