手机版

ASP .NET WebAPi(selfhost)实现文件同步或异步上传

时间:2021-09-13 来源:互联网 编辑:宝哥软件园 浏览:

前言前面我们讲过利用AngularJs上传到WebAPi中进行处理,同时我们在手动音量调节系列中讲过文件上传,本文结合MVC WebAPi来进行文件的同步或者异步上传,顺便回顾下钢性铸铁和手动音量调节作为客户端,而WebAPi利用不依赖于(同移民检查员移民检查)的自宿主模式作为服务端来接收客户端的文件且其过程用埃阿斯来实现,下面我们一起来看看。

同步上传

多余的话不用讲,我们直接看页面。

div class=' container ' div @ if(viewpag .成功!=null){ div class=' alert alert-danger '角色='alert' strong成功啦!/strong成功上传a href=' @ ViewBag .成功' target='_blank '打开文件/a/div } else if(viewpag .失败!=null){ div class=' alert alert-danger '角色='alert' strong失败啦!/strong @ viewpag .失败的/div }/div @使用(Html .开始通知(同步上传,主页,表单方法).Post,new { role='form ',enctype='multipart/form-data ',@ style=' margin-top :50 px;}))){ div class=' form-group '输入类型='file' id='file '名称=' file '/div输入类型='提交'值=' Submit ' class=' BTN BTN-主要'/}/div上述我们直接上传后通过上传的状态来显示查看上传文件路径并访问,就是这么简单。下面我们来手动音量调节后台逻辑

[httpset]公共操作结果SyncUpload(httpedfilebase文件){使用(var client=new Httpclient()){ 0使用(var content=new multipartifiodatacontent()){ byte[]Bytes=new byte[file].输入流。长度为1];文件。输入流。读取(字节,0,字节。长度);var文件内容=新字节数组内容(字节);//设置请求头中的附件为文件名称,以便在WebAPi中进行获取文件内容。标题。内容处置=新系统净。Http。标题。contentdispositionheader值(“”附件){文件名=文件.FileName };内容。添加(文件内容);var Requesturi=' http://localhost :8084/API/上传/发布';定义变量结果=客户端postsync(Requesturi,内容)。结果;如果(结果。状态代码==系统. Net。HttpStatusCode.Created) {//获取到上传文件地址,并渲染到视图中进行访问var m=结果内容。ReadAsStringAsync().结果;var list=JsonConvert .反序列化对象列表字符串(m);视图包。成功=列表first or default();} else { ViewBag .失败='上传失败啦,状态码:'结果。状态代码,原因:'结果。原因描述,错误信息:'结果内容。ToString();} } }返回视图();}注意:上述将获取到文件字节流数组需要传递给多部分表单数据内容,要不然传递到WebAPi时会获取不到文件数据。

到这里为止在手动音量调节中操作就已经完毕,此时我们来看看在WebAPi中需要完成哪些操作。

(1)首先肯定需要判断上传的数据是否是MimeType类型。

if(!请求内容。IsimeMultipontent()){ 0抛出新的HttpStatusCode . HttpResponseException(HttpStatusCode).UnsupportedMediaType);}(2)我们肯定是需要重新生成一个文件名称以免重复,利用全局唯一标识符或者日期或者其他。

字符串名称=项目标题。内容处置。文件名。替换(' \ ' ',' ');字符串新文件名=Guid .NewGuid().ToString('N ')路径GetExtension(名称);(3)我们需要利用此类多部分文件流提供程序设置上传路径并将文件写入到这个里面。

var provider=new multipperfilestream provider(根路径);变量任务=请求。内容。ReadAsMultipartAsync(提供程序).(4) 返回上传文件地址。

请求退货CreateResponse(HttpStatusCode .已创建,JsonConvert .SerializeObject(savedFilePath));分步骤解析了这么多,组装代码如下:

public taskshttpresponsemessage Post(){ Liststring savedFilePath=new Liststring();if(!请求内容。IsimeMultipontent()){ 0抛出新的HttpStatusCode . HttpResponseException(HttpStatusCode).UnsupportedMediaType);} var substringBin=AppDomain .当前域。基本目录。index of(' bin ');定义变量路径=AppDomain .当前域。基本目录。子串(0,子串bin);字符串rootPath=路径"上传";var provider=new multipperfilestream provider(根路径);变量任务=请求。内容ReadAsMultipartAsync(提供程序)。ContinueWithHttpResponseMessage(t={如果(t)被取消| | t出现故障){请求.CreateErrorResponse(HttpStatusCode .内部服务器错误,异常);} foreach(提供程序中的多部分文件数据项文件数据){尝试{字符串名称=项目.标题。内容处置。文件名。替换(' \ ' ',' ');字符串新文件名=Guid .NewGuid().ToString('N ')路径GetExtension(名称);文件。移动(项目。本地文件名,路径。组合(根路径,新文件名));//请求。请求Uri .路径和路径为需要去掉域名的后面地址//如上述请求为http://localhost :80824/API/上传/发帖,这就为API/上传/发布//请求RequestUri。绝对的则为http://localhost :8084/API/上传/发布Uri基本Uri=新Uri(请求。替换(请求。请求Uri .路径和查询,字符串。空的));字符串文件相对路径=根路径' \ \ '新文件名;Uri fileFullPath=new Uri(baseuri,FileRelativePath);保存文件路径.添加(文件完整路径. ToString());}捕获(例外情况){ 0字符串消息=ex .消息;} }返回请求CreateResponse(HttpStatusCode .已创建,JsonConvert .SerializeObject(savedFilePath));});返回任务;}注意:上述项目。本地文件名为e : \ Documents \ Visual Studio 2013 \ project \ WebAPiReturnHtml \ WebAPiReturnHtml \上传\ body part _ fa01 ff 79-4a 5 B- 40 F6-887 f-ab 514 EC 6636 f,因为此时我们重新命名了文件名称,所以需要将该文件移动到我们重新命名的文件地址。

整个过程就是这么简单,下面我们来看看演示结果。

此时居然出错了,有点耐人寻味,在服务端是返回如下的Json字符串

复制代码代码如下:列表字符串savedFilePath=new列表字符串();

此时进行反序列化时居然出错,再来看看页面上的错误信息:

无法将字符串转换为列表字符串,这不是一一对应的么,好吧,我来看看返回的字符串到底是怎样的,【当将鼠标放上去】时查看的如下:

【当将点击查看】时结果如下:

由上知点击查看按钮时返回的才是正确的json,到了这里我们发现Json .网序列化时也是有问题的,于是乎在进行反序列化时将返回的字符串需要进行一下处理转换成正确的json字符串来再来进行反序列化,修改如下:

var m=结果内容。ReadAsStringAsync().结果;m=m .修剪起点(' \ ');m=m . TriMend(' \ ' ');m=m。替换(' \\ ',' ');var list=JsonConvert .反序列化对象列表字符串(m);

最终在页面显示如下:

到这里我们的同步上传告一段落了,这里面利用Json .网进行反序列化时居然出错问题,第一次遇到Json .网反序列化时的问题,比较奇葩,费解。

异步上传

所谓的异步上传不过是利用埃阿斯进行上传,这里也就是为了复习下脚本或者剃刀视图,下面的内容只是将视图进行了修改而已,对于异步上传我利用了jquery.form.js中的异步api,请看如下代码:

script src=' http : ~/Scripts/jquery-1。10 .2 .量滴js '/script script src=' http : ~/Scripts/jquery。形式。js '/script script src=' http : ~/Scripts/bootstrap。量滴js '/脚本链接href=' ~/Content/bootstrap。量滴CSS ' rel='样式表/div类='容器style=' margin-top 336030 px ' div div class=' alert alert-danger '角色='alert' strong上传成功/strong span style='右边距:50 px'/spana href=' target=' _ blank ' id=' LinkAddr '文件访问地址/a/div/div div id=' fail ' style=' display : none;div class=' alert alert-危险'角色='alert' strong上传失败/strong/div/div @使用(Ajax .begin inform(' async upload ',' Home ',new AJaxooptions(){ HttpMethod=' POST ' },new { enctype=' multipart/form-data ',@ style=' margin-top 336010 px;})){ div class='form-group '输入类型=' file ' name=' file ' id=' fu1 '/div class=' form-group '输入类型=' submit ' class=' BTN BTN-primary ' value='上传//div } div class=' form-group ' div class=' progress ' id=' progress ' style=' display : none;'' div class='进度条0%/div/div id=' status '/div/div样式.进度{位置:相对;宽度: 400像素;border: 1px固体# dddpadding: 1px}。进度条{ width: 0px高度: 40px背景色: # 57be 65}/style script(function(){ var bar=$(').进度条');var百分比=$(' .进度条');$(“表单”).Ajax表单({ BeforeSend :函数(){ $(' # progress ')).show();var百分比值=' 0% ';bar.width(百分比值);percent.html(百分比值);},uploadProgress:函数(事件、位置、总计、百分比完成){ var百分比值=完成百分比' % ';bar.width(百分比值);percent.html(百分比值);},成功:函数(d){ var percent value=' 100% ';bar.width(百分比值);percent.html(百分比值);$('#fu1 ').val(" ");},完成:函数(xhr){ if(xhr。responsetext!=null) { $('#linkAddr ').prop('href ',xhr。response text);$(' #成功').show();} else { $(“# fail”).show();} } });})();/script我们截图看下其中上传过程

上传中:

上传完成:

当然这里的100%不过是针对小文件的实时上传,如果是大文件肯定不是实时的,利用其它组件来实现更加合适,这里我只是学习学习仅此而已。

注意:这里还需重申一遍,之前在手动音量调节上传已经叙述过,MVC默认的上传文件是有限制的,所以超过其限制,则无法上传,需要进行如下设置

(1)在IIS 5和IIS 6中,默认文件上传的最大为四兆,当上传的文件大小超过四兆时,则会得到错误信息,但是我们通过如下来设置文件大小。

系统。web Httpruntime MaxRequestLength=' 2147483647 '执行超时=' 100000 '/系统。网络(2)在IIS 7,默认文件上传的最大为28.6兆,当超过其默认设置大小,同样会得到错误信息,但是我们却可以通过如下来设置文件上传大小(同时也要进行如上设置)。

system.webServer安全请求筛选请求限制maxAllowedContentLength=' 2147483647 '/请求填充/安全/系统。web服务器总结

本节我们学习了如何将手动音量调节和WebAPi隔离开来来进行上传,同时我们也发现在反序列化时Json .网有一定问题,特此记录下,当发现一一对应时反序列化返回的Json字符串不是标准的Json字符串,我们对返回的Json字符串需要作出如下处理才行(也许还有其他方案)。

var jsonString='返回的json字符串;jsonString=jsonString .修剪开始(' \ ');jsonString=jsonString .TrimEnd(' \ ');jsonString=jsonString .替换(' \\ ',' ');接下来会准备系统学习下结构化查询语言服务器和甲骨文,循序渐进,你说呢!休息,休息!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:ASP .NET WebAPi(selfhost)实现文件同步或异步上传是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。