asp.net大文件上传解决方案实例代码
以ASP.NETCoreWebAPI作后端API,用Vue构建前端页面,用Axios从前端访问后端API,包括文件的上传和下载。
准备文件上传的API
#region文件上传可以带参数 [HttpPost("upload")] publicJsonResultuploadProject(IFormFilefile,stringuserId) { if(file!=null) { varfileDir="D:\\aaa"; if(!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } //文件名称 stringprojectFileName=file.FileName; //上传的文件的路径 stringfilePath=fileDir+$@"\{projectFileName}"; using(FileStreamfs=System.IO.File.Create(filePath)) { file.CopyTo(fs); fs.Flush(); } returnJson("ok"); }else{ returnJson("no"); } } #endregion
前端vue上传组件(利用Form表单上传)
用element-ui的Upload组件上传文件
http://element-cn.eleme.io/#/zh-CN/component/upload
选取文件 上传到服务器
文件下载
普通的文件下载方式是访问一个后台文件流地址,直接生成对应的文件,下载即可,地址栏中也可携带一些控制参数,但是无法通过header传递参数。
两种文件下载方式,一种是,直接返回file文件,利用浏览器的下载功能。但是这种没有发现可以在发送请求的时候携带token;另一种是利用Axios发送下载文件的请求,可以设置header头,可以携带token,但是response-type是blob类型的。
第一种:
后端API:
publicFileResultdownloadRequest() { //varaddrUrl=webRootPath+"/upload/thumb.jpg"; varaddrUrl="D:/aaa/thumb.jpg"; varstream=System.IO.File.OpenRead(addrUrl); stringfileExt=Path.GetExtension("thumb.jpg"); //获取文件的ContentType varprovider=newFileExtensionContentTypeProvider(); varmemi=provider.Mappings[fileExt]; returnFile(stream,memi,Path.GetFileName(addrUrl)); }
前端利用浏览器的功能url直接返回文件
下载文件...
downloadRequest(){ leturl="Home/downloadRequest";//可以在路径中传递参数 window.location.href=url; }, 第二种 后端api,两个api的返回类型不同,asp.netcore文件下载常用的有FileResult、FileContentResult、FileStreamResult。 publicFileContentResultdownloadRequest1() { //stringwebRootPath=_hostingEnvironment.WebRootPath; //varaddrUrl=webRootPath+"/upload/thumb.jpg"; varaddrUrl="D:/aaa/wyy.exe"; /*varstream=System.IO.File.OpenRead(addrUrl); stringfileExt=Path.GetExtension("thumb.jpg"); //获取文件的ContentType varprovider=newFileExtensionContentTypeProvider(); varmemi=provider.Mappings[fileExt]; returnFile(stream,memi,Path.GetFileName(addrUrl));*/ //returnstream; byte[]fileBytes=System.IO.File.ReadAllBytes(addrUrl); stringfileName="wyy.exe"; returnFile(fileBytes,System.Net.Mime.MediaTypeNames.Application.Octet,fileName);//关键语句 }
前端页面
blob(用来存储二进制大文件)
下载文件11 ... ... ... downloadRequest1(){ axios({ //用axios发送post请求 method:"post", url:"Home/downloadRequest1",//请求地址,也可以传递参数 headers:{ //可以自定义header gggg:"gggggggggggggggggggggggggggggggggggggggggggggggggggg"//可以携带token }, responseType:"blob"//表明返回服务器返回的数据类型 }).then(res=>{ //处理返回的文件流 //主要是将返回的data数据通过blob保存成文件 varcontent=res.data; varblob=newBlob([content]); varfileName="wyy.exe";//要保存的文件名称 if("download"indocument.createElement("a")){ //非IE下载 varelink=document.createElement("a"); elink.download=fileName; elink.style.display="none"; elink.href=URL.createObjectURL(blob); document.body.appendChild(elink); elink.click(); URL.revokeObjectURL(elink.href);//释放URL对象 document.body.removeChild(elink); }else{ //IE10+下载 navigator.msSaveBlob(blob,fileName); } console.log(res); }); }
上面就是两种最好用的asp.net大文件上传解决方案,大家可以测试下,感谢大家对毛票票的支持。