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 相关文章推荐
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
Mar 31 Javascript
javascript,jquery闭包概念分析
Jun 19 Javascript
js最简单的拖拽效果实现代码
Sep 24 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
Dec 10 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
Dec 18 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 Javascript
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
详解jquery和vue对比
2019/04/16 jQuery
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
浅谈Python数据类型之间的转换
2016/06/08 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
python中退出多层循环的方法
2018/11/27 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
Python的缺点和劣势分析
2019/11/19 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
应聘教师推荐信
2013/10/31 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
工作作风建设心得体会
2014/10/22 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
英文升职感谢信
2015/01/23 职场文书
2015年店长工作总结范文
2015/04/08 职场文书