angularJs2 formData 传有附件的请求
2017-10-01 20:29
176 查看
最近项目中需要提交个form中有上传附件功能的需求,项目用的angular2版本,UI用的PrimeNG开源框架,这里的upload file的控件就是已经是框架提供了的。https://www.primefaces.org/primeng/#/setup 感兴趣的可以去这个官网学习下。可以用npm命令去下载。
官方的原本控件应该是这个样子,但是这个控件只能点击Upload方法去提交附件,而且有些属性在我的项目中并没有起作用估计是我用的版本太低问题,比如customUpload,还有方法,导致很多功能不能用。不过最终我是在commponent引入Jquery,来做了这个需求。hidden upload的按钮,在import头上声明 declare var $: any就可以了,之前头文件必须添加jquery的引用。
最简单的直接用css样式,找到这个标签然后display设置为None.
$("[icon='fa-upload']").css("display", "none");
在控件中加onSelect 和 onClear方法,做对fileList的保存还有清除。
创建一个新的form用来穿formdata, 如果有file文件就append到form上。
var formData = new FormData();
this.absenceReuqest.Duration = value["duration"];
formData.append('RequestModel', JSON.stringify(this.absenceReuqest));
后台C#code: 用json convert到自己的实体里。如果有文件就加进一个list中。最终转成base64 string存在数据库中。
官方的原本控件应该是这个样子,但是这个控件只能点击Upload方法去提交附件,而且有些属性在我的项目中并没有起作用估计是我用的版本太低问题,比如customUpload,还有方法,导致很多功能不能用。不过最终我是在commponent引入Jquery,来做了这个需求。hidden upload的按钮,在import头上声明 declare var $: any就可以了,之前头文件必须添加jquery的引用。
最简单的直接用css样式,找到这个标签然后display设置为None.
$("[icon='fa-upload']").css("display", "none");
在控件中加onSelect 和 onClear方法,做对fileList的保存还有清除。
<p-fileUpload #uploadFileId name="UploadFiles[]" url="" multiple="multiple" accept="image/*" maxFileSize="5000000" (onSelect)="myUploader($event)" (onClear)="removeAll($event)" cancelLabel="Remove"></p-fileUpload> <div class="ui-message ui-messages-error ui-corner-all" *ngIf="attachmentShowError"> <i class="fa fa-close"></i> {{attachmentErrorMessage}} </div>
myUploader(event: any) { for (let file of event.files) { if (!this.validatorsService.isContains(this.uiConfigModel._acceptFileType, file.type)) { this.attachmentShowError = true; this.attachmentErrorMessage = 'allowed file types ' + this.uiConfigModel._acceptFileType; } else { this.attachmentShowError = false; } this.uploadedFiles.push(file); } setTimeout(function removeDeleteBtn() { if ($('div[class="ui-fileupload-row"]') && $('button[icon="fa-close"]')) { $('div[class="ui-fileupload-row"] button[icon="fa-close"]').css("display", "none"); } }, 50) } removeAll(event: any) { this.uploadedFiles.splice(0, this.uploadedFiles.length); this.attachmentShowError = false; }这样在做submit的时候,就可以在component中拿到上传的fileList了。这是以前的代码,用的 http.post ng封装好的post请求方法,不知道哪里出错,有文件的数据,传出去怎么都是接收不到,换了各种 Content-Type,都还是接收不到,通过F12看,才发现每次Ng都会自动给这个设置成 ‘application/json’的格式,无论用delete还是set都不行,设置Undefined也是自动用的json传的数据。最终放弃用jquery ajax直接去发请求ok.
saveAbsenceRequest(RequestModel: any) { let headers = new Headers(); headers.append('X-Requested-With', 'XMLHttpRequest'); //headers.append('Content-Type', 'application/x-www-form-urlencoded'); //headers.set('Content-Type', undefined); headers.delete("Content-Type"); //headers.append('Accept', 'application/json'); let myOptions = new RequestOptions({ headers: headers }); //return this.http.post('./LeaveInfo/SaveAbsenceRequest', { data: RequestModel }, myOptions).toPromise() // .then(res => <AbsenceRequestModal>res.json().data) // .then(data => { return data; }); }
创建一个新的form用来穿formdata, 如果有file文件就append到form上。
var formData = new FormData();
this.absenceReuqest.Duration = value["duration"];
formData.append('RequestModel', JSON.stringify(this.absenceReuqest));
for (var i = 0; i < this.uploadedFiles.length; i++) { if (!this.validatorsService.isContains(this.uiConfigModel._acceptFileType, this.uploadedFiles[i].type)) { this.loading = false; this.attachmentShowError = true; this.attachmentErrorMessage = 'allowed file types ' + this.uiConfigModel._acceptFileType; return false; } formData.append("UploadFiles", this.uploadedFiles[i]);然后直接用ajax 发请求,然后顺利拿到form的所有数据。还有 由于在TS里直接用ajax中请求,js代码就不会被编译,所以在success 或者 error里用 TS的属性还有一些功能就不会生效了,所以要拿到外面,最好用同步发请求 这样就可以拿到返回的值就可以做 成功还是失败后的功能了。
$.ajax({ url: './LeaveInfo/SaveRequest', data: formData, type: 'POST', contentType: false, processData: false, async: false, success: function (data: any) { if (data.data.IsSuccess) { messageFlag = "success"; } else { messageFlag = "failure"; } }, error: function (err: any) { messageFlag = "failure"; } });
后台C#code: 用json convert到自己的实体里。如果有文件就加进一个list中。最终转成base64 string存在数据库中。
public ActionResult SaveRequest() { if (Request.Form["RequestModel"] == null) return null; var absenceRequestModel = Newtonsoft.Json.JsonConvert.DeserializeObject<AbsenceRequestModel>(Request.Form["RequestModel"]);
if (Request.Files.Count > 0) { var AttachmentFiles = new List<Attachmentfiles>(); for (int i = 0; i < Request.Files.Count; i++) { var attachment = new Attachmentfiles { FileContent = GetAttachmentContent(Request.Files[i]), FileName = Request.Files[i].FileName }; AttachmentFiles.Add(attachment); } absenceRequestList.Attachements = AttachmentFiles; }
}
private string GetAttachmentContent(HttpPostedFileBase file) { byte[] fileContentData; using (var inputStream = file.InputStream) { var memoryStream = inputStream as MemoryStream; if (memoryStream == null) { memoryStream = new MemoryStream(); inputStream.CopyTo(memoryStream); } fileContentData = memoryStream.ToArray(); } var FileStr = Convert.ToBase64String(fileContentData); return FileStr; }
相关文章推荐
- 使用FormData进行Ajax请求上传文件的实例代码
- HTTP协议之multipart/form-data请求分析
- 【原创】在DataFormWebPart中将列表附件显示为图片(一)[How to display list item attachments as image in DFWP Part1]
- HTTP协议之multipart/form-data请求分析
- 使用requests库提交multipart/form-data 格式的请求
- HTTP协议之multipart/form-data请求分析
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form me
- HTTP请求中的form data和request payload的区别等(转载)
- HTTP协议之multipart/form-data请求分析
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- 在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传
- 谈谈form-data请求格式
- [转]AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- Ajax+FormData实现大附件上传带进度条
- 利用 FormData 对象发送 Key/Value 对的异步请求
- HTTP AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- MOSS2007 xslt Get Attachments 附件 自定义 DataFormWebPart
- Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法
- Python发送form-data请求及拼接form-data内容的方法