C# Angular 1.2.10-Breeze-.Net 4.5-带表单的文件上载

C# Angular 1.2.10-Breeze-.Net 4.5-带表单的文件上载,c#,.net,angularjs,file-upload,C#,.net,Angularjs,File Upload,我的环境:Angular 1.2.10-Breeze-.Net-Entity Framework ADO.NET6.0 我看过很多关于文件上传的帖子(单独一篇),比如 我试图上传一个表单中的所有文件,但没有成功 你知道吗 我在角度方面做mvvm,它给出: 角度-html: Hi All, 在这个post方法中,我想对viewModel使用的用户(JSon格式)做一些处理,这是可以的。 同时,我想从表单上传文件(从角度表单上传元素'fileToUpload')。可能吗

我的环境:Angular 1.2.10-Breeze-.Net-Entity Framework ADO.NET6.0

我看过很多关于文件上传的帖子(单独一篇),比如 我试图上传一个表单中的所有文件,但没有成功

你知道吗

我在角度方面做mvvm,它给出:

角度-html:

             Hi All,
在这个post方法中,我想对viewModel使用的用户(JSon格式)做一些处理,这是可以的。 同时,我想从表单上传文件(从角度表单上传元素'fileToUpload')。可能吗

在互联网上找到的所有例子都没有给出答案

我认为用于序列化的Json格式无法使用该文件

XML序列化会有帮助吗

有更简单的解决方案吗


谢谢你的帮助,我找到了解决问题的办法。 它包括只执行上传文件,将用户花费在上传文件上(更改名称==>Register),它在datacontext(javascript)中给出:

在服务器端,它在ApiController中提供:

function Register($upload, user, postedFile) {
    return $q.when(
                    $upload.upload({
                        url: 'CVApp/User/Register', //upload.php script, node.js route, or servlet url
                        method: 'POST',
                        // headers: {'headerKey': 'headerValue'},
                        // withCredential: true,
                        data: user,
                        file: postedFile,
                        // file: $files, //upload multiple files, this feature only works in HTML5 FromData browsers
                        /* set file formData name for 'Content-Desposition' header. Default: 'file' */
                        //fileFormDataName: myFile, //OR for HTML5 multiple upload only a list: ['name1', 'name2', ...]
                        /* customize how data is added to formData. See #40#issuecomment-28612000 for example */
                        //formDataAppender: function(formData, key, val){} //#40#issuecomment-28612000
                    }
                )
                .then(successCallback)
                .catch(failCallback)     // same as 'then(null, failCallback)'
                .finally(finalCallback) // sort of like 'then(finalCallback, finalCallback)'
    );
}
[System.Web.Http.AcceptVerbs(“POST”)]
公共异步任务寄存器()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/IdPhoto”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
//读取表单数据。
wait Request.Content.ReadAsMultipartAsync(提供程序);
用户用户=新用户(provider.FormData);
System.Web.Security.MembershipCreateStatus状态=MembershipCreateStatus.UserRejected;
CVAppMembershipProvider MPProvider=(CVAppMembershipProvider)System.Web.Security.Membership.Providers[“CVAppMembershipProvider”];
MembershipUser usr=mProvider.CreateUser(用户,退出状态);
if(status==MembershipCreateStatus.Success)
{
FormsAuthenticationTicket=新的FormsAuthenticationTicket(1,
usr.UserName,
日期时间,现在,
DateTime.Now.AddMonths(1),
错误的
“”,//用户数据
FormsAuthentication.FormScookePath);
////加密票据。
字符串encTicket=FormsAuthentication.Encrypt(票据);
var resp=新的HttpResponseMessage();
//创建并设置cookie作为响应
var cookie=新CookieHeaderValue(FormsAuthentication.FormsCookieName,encTicket);
cookie.Expires=DateTimeOffset.Now.AddMonths(1);
cookie.Domain=Request.RequestUri.Host;
cookie.Path=“/”;
resp.Headers.AddCookies(新CookieHeaderValue[]{cookie});
}
其他的
{
抛出新异常(status.ToString()+“-”+GetErrorMessage(status));
}
//这说明了如何获取文件名。
foreach(provider.FileData中的MultipartFileData文件)
{
字符串文件名=file.Headers.ContentDisposition.fileName;
if(fileName.StartsWith(“\”)和&fileName.EndsWith(“\”)
{
fileName=fileName.Trim(“”);
}
if(fileName.Contains(@“/)| | fileName.Contains(@“\”))
{
fileName=Path.GetFileName(fileName);
}
fileName=user.UserName.Replace(“,“”)+”+fileName.Substring(fileName.IndexOf(“.”+1);
Copy(File.LocalFileName,Path.Combine(root,fileName));
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
捕获(例外e)
{
//返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
投掷e;
}
}
瞧!它起作用了

现在,我只需要在处理过程中使用“BusyIndicator”,在最后使用错误/正确消息,并且能够按照我想要的顺序执行异步方法(如果可能的话,我认为“then”可以做到这一点),我仍在搜索,我想我会在Internet上快速找到它


Thanx

这不是Breeze的问题,因为Breeze没有以任何相关方式参与。这就是我删除Breeze标签的原因。
(function () {
    'use strict';
    var controllerId = 'register';
    angular.module('app').controller(controllerId, ['common', 'datacontext', 'entityManagerFactory', register]);

    function register(common, datacontext, entityManagerFactory) {
        var getLogFn = common.logger.getLogFn;
        var log = getLogFn(controllerId);

        var vm = this;
        vm.title = 'Register';
        vm.Ctrl = Ctrl;
        vm.CtrlPhoto = CtrlPhoto;

        var user = {
            ApplicationId: "1",
            UserId: "",
            UserName: "",
            LoweredUserName: "",
            MobileAlias: "",
            IsAnonymous: false,
            LastActivityDate: "",
            FirstName: "",
            LastName: "",
            BirthDate: "",
            CountryCode: "",
            Phone: "",
            Photo: "",
            PathPhoto: "",
            Position: "",
            Interests: "",
            Application: "",
            Membership: {
                ApplicationId: "1",
                UserId: "",
                Password: "",
                PasswordFormat: "",
                PasswordSalt: "",
                MobilePIN: "",
                Email: "",
                LoweredEmail: "",
                PasswordQuestion: "",
                PasswordAnswer: "",
                IsApproved: "",
                IsLockedOut: "",
                CreateDate: "",
                LastLoginDate: "",
                LastPasswordChangedDate: "",
                LastLockoutDate: "",
                FailedPasswordAttemptCount: "",
                FailedPasswordAttemptWindowStart: "",
                FailedPasswordAnswerAttemptCount: "",
                FailedPasswordAnswerAttemptWindowStart: "",
                Comment: "",
                Application: "",
                User: ""
            },
            Missions: "",
            PersonalizationPerUsers: "",
            Profile: "",
            WebpagesOAuthMemberships: "",
            Roles: "",
            PostedFile: ""
        };
        vm.user = user;

        activate();

        function activate() {
            common.activateController(null, controllerId)
                .then(function () {
                    log('Activated Register View');
                });
        }

        function CtrlPhoto($scope) {
            $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];
                    vm.user.PostedFile = file;
                    //$scope.upload = $upload.upload({
                    //    url: '/IdPhoto', //upload.php script, node.js route, or servlet url
                    //    // method: POST or PUT,
                    //    // headers: {'headerKey': 'headerValue'},
                    //    // withCredential: true,
                    //    data: vm.myModelObj,
                    //    file: file,
                    //    // file: $files, //upload multiple files, this feature only works in HTML5 FromData browsers
                    //    /* set file formData name for 'Content-Desposition' header. Default: 'file' */
                    //    //fileFormDataName: myFile, //OR for HTML5 multiple upload only a list: ['name1', 'name2', ...]
                    //    /* customize how data is added to formData. See #40#issuecomment-28612000 for example */
                    //    //formDataAppender: function(formData, key, val){} //#40#issuecomment-28612000
                    //}).progress(function (evt) {
                    //    console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
                    //}).success(function (data, status, headers, config) {
                    //    // file is uploaded successfully
                    //    console.log(data);
                    //});
                    //.error(...)
                    //.then(success, error, progress); 
                }
            }
        }

        function Ctrl($scope) {
            $scope.submit = function () {
                //vm.user.Photo = document.getElementById("fileToUpload");
                datacontext.Register(vm.user)
                            //.then(loadFile($upload))
                            .then(common.logger.log("File posted"))
                            .catch(failCallback)

                //$upload.upload({
                //    url: '~/IdPhoto',
                //    file: vm.user.PathPhoto // for single file
                //})
                //.then(function (data) {
                //    vm.user.PathPhoto.fileId = data;
                //})
            };
            function loadFile($upload) {
                //var fd = new FormData();
                var fileToUpload = document.getElementById("fileToUpload");
                //fd.append("uploadedFile", fileToUpload);

                //var xhr = new XMLHttpRequest();

                //xhr.open("POST", '/IdPhoto');
                //xhr.send(fd)



                $upload.upload({
                    url: '/IdPhoto',
                    file: fileToUpload,
                }).then(function (data, status, headers, config) {
                    // file is uploaded successfully
                    //console.log(data);
                }).catch(failCallback(error));

            }
        }

        function failCallback(error) {
            var msg = 'Error Posting File ' + error.message;
            common.logger.logError(msg, error);
            throw error;
        }

    }
})();
[System.Web.Http.AcceptVerbs("POST")]
//[HttpPost]
public string Register(User user)
{
    System.Web.Security.MembershipCreateStatus status = MembershipCreateStatus.UserRejected;
    //pour les nouvelles inscriptions il n'y a pas de nwpassword et de confirmnewpassword
    //ModelState.Remove("user.Membership.NewPassword");
    //ModelState.Remove("user.Membership.ConfirmNewPassword");

    //if (ModelState.IsValid)
    //{
        // Tentative d'inscription de l'utilisateur
        try
        {
            CVAppMembershipProvider provider = (CVAppMembershipProvider)System.Web.Security.Membership.Providers["CVAppMembershipProvider"];
            var httpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"];
            var foo = httpContext.Request.Form["Foo"];


            MembershipUser usr = provider.CreateUser(user, out status);

            if (status == MembershipCreateStatus.Success)
            {
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                  usr.UserName,
                  DateTime.Now,
                  DateTime.Now.AddMonths(1),
                  false,
                  "", //userData
                  FormsAuthentication.FormsCookiePath);

                ////Encrypt the ticket.
                string encTicket = FormsAuthentication.Encrypt(ticket);

                var resp = new HttpResponseMessage();
                //create and set cookie in response
                var cookie = new CookieHeaderValue(FormsAuthentication.FormsCookieName, encTicket);
                cookie.Expires = DateTimeOffset.Now.AddMonths(1);
                cookie.Domain = Request.RequestUri.Host;
                cookie.Path = "/";
                resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
            }
            else
            {
                ModelState.AddModelError(status.ToString(), GetErrorMessage(status));
            }
        }
        catch (Exception e)
        {
            ModelState.AddModelError("", e.Message);
        }
    //}

    return status.ToString();

}
function Register($upload, user, postedFile) {
    return $q.when(
                    $upload.upload({
                        url: 'CVApp/User/Register', //upload.php script, node.js route, or servlet url
                        method: 'POST',
                        // headers: {'headerKey': 'headerValue'},
                        // withCredential: true,
                        data: user,
                        file: postedFile,
                        // file: $files, //upload multiple files, this feature only works in HTML5 FromData browsers
                        /* set file formData name for 'Content-Desposition' header. Default: 'file' */
                        //fileFormDataName: myFile, //OR for HTML5 multiple upload only a list: ['name1', 'name2', ...]
                        /* customize how data is added to formData. See #40#issuecomment-28612000 for example */
                        //formDataAppender: function(formData, key, val){} //#40#issuecomment-28612000
                    }
                )
                .then(successCallback)
                .catch(failCallback)     // same as 'then(null, failCallback)'
                .finally(finalCallback) // sort of like 'then(finalCallback, finalCallback)'
    );
}
[System.Web.Http.AcceptVerbs("POST")]
public async Task<HttpResponseMessage> Register()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/IdPhoto");
    var provider = new MultipartFormDataStreamProvider(root);

    try
    {
        // Read the form data.
        await Request.Content.ReadAsMultipartAsync(provider);

        User user = new User(provider.FormData);

        System.Web.Security.MembershipCreateStatus status = MembershipCreateStatus.UserRejected;
        CVAppMembershipProvider mProvider = (CVAppMembershipProvider)System.Web.Security.Membership.Providers["CVAppMembershipProvider"];

        MembershipUser usr = mProvider.CreateUser(user, out status);

        if (status == MembershipCreateStatus.Success)
        {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
              usr.UserName,
              DateTime.Now,
              DateTime.Now.AddMonths(1),
              false,
              "", //userData
              FormsAuthentication.FormsCookiePath);

            ////Encrypt the ticket.
            string encTicket = FormsAuthentication.Encrypt(ticket);

            var resp = new HttpResponseMessage();
            //create and set cookie in response
            var cookie = new CookieHeaderValue(FormsAuthentication.FormsCookieName, encTicket);
            cookie.Expires = DateTimeOffset.Now.AddMonths(1);
            cookie.Domain = Request.RequestUri.Host;
            cookie.Path = "/";
            resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
        }
        else
        {
            throw new Exception(status.ToString() + " - " + GetErrorMessage(status));
        }

        // This illustrates how to get the file names.
        foreach (MultipartFileData file in provider.FileData)
        {
            string fileName = file.Headers.ContentDisposition.FileName;
            if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
            {
                fileName = fileName.Trim('"');
            }
            if (fileName.Contains(@"/") || fileName.Contains(@"\"))
            {
                fileName = Path.GetFileName(fileName);
            }

            fileName = user.UserName.Replace(" ", "_") + "." + fileName.Substring(fileName.IndexOf(".") + 1);

            File.Copy(file.LocalFileName, Path.Combine(root, fileName));
        }
        return Request.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception e)
    {
        //return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        throw e;
    }
}