前端AngularJS后端ASP.NET Web API上传文件
本篇体验使用AngularJS向后端ASP.NET 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().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上传文件的更多相关文章
- ASP.NET Web API 上传文件
HTML表单: <form id="form1" method="post" enctype="multipart/form-data" ...
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- C# Web Api 上传文件
一. 使用默认方法上传文件: 1.Action: /// <summary> /// 上传文件 使用上传后的默认文件名称 /// 默认名称是BodyPart_XXXXXX,BodyPart ...
- 1.5 WEB API 上传文件
1.前提,设置跨域 2.在控制器头添加允许跨域 /// <summary> /// 文件管理口控制器 /// </summary> [EnableCors("*&qu ...
- HttpClient 测试web API上传文件实例
1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现分页、过滤
在上一篇中实现了增删改查,本篇实现分页和过滤. 本系列包括: 1.前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查2.前端使用AngularJS的$re ...
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
AngularJS中的$resource服务相比$http服务更适合与RESTful服务进行交互.本篇后端使用ASP.NET Web API, 前端使用$resource,实现增删改查. 本系列包括: ...
- Angularjs 通过asp.net web api认证登录
Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认 ...
随机推荐
- OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- C++11 AUTO 类型实践
auto在C++11中引入,为大家带来方便. 具体使用及注意事项参考: https://blog.csdn.net/xiaoquantouer/article/details/51647865 htt ...
- 【python】time和datetime的strptime不是线程安全的!
来源:http://blog.csdn.net/kevin6216/article/details/9021039 在多线程中用strptime需要加锁!!!
- 【mysql】autocommit=0后,commit, rollback无效
之前在[mysql]MySQLdb中的事务处理中用autocommit和commit()以及rollback()实现了事务处理. 但后来,用同样的代码在另一个数据库中运行却失败了.找了一个下午的原因. ...
- 步步为营-11-List<T>泛型的简单练习
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Linux学习笔记(Ubuntu操作系统)之hadoop学习之路
1:检查虚拟机的ip命令:ifconfig 2:普通用户切换root用户命令:su 3:root用户切换普通用户命令:su 用户名 4:普通用户执行系统执行前面加命令:sudo 5:查询主机名命令:h ...
- S2750&S5700&S6700 V200R003(C00&C02&C10) MIB参考
https://support.huawei.com/enterprise/docinforeader.action?contentId=DOC1000027337&idPath=791971 ...
- asp.net core 微信获取用户openid
获取openid流程为首先根据微信开发参数构造AuthorizeUrl认证链接,用户跳转到该链接进行授权,授权完成将跳转到回调页(首次认证需要授权,后面将直接再跳转至回调页),此时回调页中带上一个GE ...
- Python sys.stdout sys.stdin
引用自:https://www.cnblogs.com/keye/p/7859181.html 引用自:https://blog.csdn.net/sxingming/article/details/ ...
- this关键字的用法(包括this语句)
一:概述 this代表它所在函数所属对象的引用. 简单说:哪个对象在调用this所在的函数,this就代表哪个对象. 二:关于运用的程序 同龄人的比较. 三:关于this语句的使用 用于构造函数之间进 ...