C# Angular 1.2.10-Breeze-.Net 4.5-带表单的文件上载
我的环境:Angular 1.2.10-Breeze-.Net-Entity Framework ADO.NET6.0 我看过很多关于文件上传的帖子(单独一篇),比如 我试图上传一个表单中的所有文件,但没有成功 你知道吗 我在角度方面做mvvm,它给出: 角度-html: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')。可能吗
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;
}
}