• 前端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(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();
            }
        })
  • 相关阅读:
    Django用户认证系统(三)组与权限
    Django用户认证系统(二)Web请求中的认证
    Django用户认证系统(一)User对象
    Django QuerySet API文档
    带有Header的SOAP 请求
    环境的配置,就需要理解组件的原理和机制。
    Hotspot JVM的常用选项
    Java程序员必学的Hotspot JVM选项
    三大Java 虚拟机垃圾回收机制的比较(HotSpot, JRockit, IBM JVM)
    [原]使用Fiddler捕获java的网络通信数据
  • 原文地址:https://www.cnblogs.com/darrenji/p/5179480.html
Copyright © 2020-2023  润新知