ASP.NET Core单文件和多文件上传并保存到服务端的方法
前言:
在我们日常开发中,关于图片,视频,音频,文档等相关文件上传并保存到服务端中是非常常见的一个功能,今天主要是把自己在开发中常用的两种方式记录下来方便一下直接使用,并且希望能够帮助到有需要的同学!
一、配置ASP.NETCore中的静态文件:
简单概述:
在ASP.NETCore应用中静态资源文件需要进行相应的配置才能够提供给客户端直接使用。
详情描述请参考官方文档:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1
简单配置,提供Web根目录内的文件:
调用Startup.Configure中的UseStaticFiles方法配置:
publicvoidConfigure(IApplicationBuilderapp)
{
app.UseStaticFiles();
}
二、文件服务器和应用程序配置(IIS,Kestrel):
详情描述,请参考官方文档说明:
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1#server-and-app-configuration
多部分正文长度限制:
MultipartBodyLengthLimit设置每个多部分正文的长度限制。分析超出此限制的窗体部分时,会引发InvalidDataException。默认值为134,217,728(128MB)。使用MultipartBodyLengthLimit中的Startup.ConfigureServices设置自定义此限制:
publicvoidConfigureServices(IServiceCollectionservices)
{
services.Configure(options=>
{
//Setthelimitto256MB
options.MultipartBodyLengthLimit=268435456;
});
}
Kestrel最大请求正文大小:
对于Kestrel托管的应用,默认的最大请求正文大小为30,000,000个字节,约为28.6MB。使用MaxRequestBodySizeKestrel服务器选项自定义限制:
publicstaticIHostBuilderCreateHostBuilder(string[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureKestrel((context,options)=>
{
//Handlerequestsupto50MB
options.Limits.MaxRequestBodySize=52428800;
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
IIS内容长度限制:
默认的请求限制(maxAllowedContentLength)为30,000,000字节,大约28.6MB。请在web.config文件中自定义此限制:
三、单文件上传:
usingSystem;
usingSystem.IO;
usingMicrosoft.AspNetCore.Hosting;
usingMicrosoft.AspNetCore.Mvc;
namespaceFileUploadManage.Controllers
{
///
///图片,视频,音频,文档等相关文件通用上传服务类
///
publicclassFileUploadController:Controller
{
privatestaticIHostingEnvironment_hostingEnvironment;
publicFileUploadController(IHostingEnvironmenthostingEnvironment)
{
_hostingEnvironment=hostingEnvironment;
}
///
///单文件上传
///
///
publicJsonResultSingleFileUpload()
{
varformFile=Request.Form.Files[0];//获取请求发送过来的文件
varcurrentDate=DateTime.Now;
varwebRootPath=_hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("")
try
{
varfilePath=$"/UploadFile/{currentDate:yyyyMMdd}/";
//创建每日存储文件夹
if(!Directory.Exists(webRootPath+filePath))
{
Directory.CreateDirectory(webRootPath+filePath);
}
if(formFile!=null)
{
//文件后缀
varfileExtension=Path.GetExtension(formFile.FileName);//获取文件格式,拓展名
//判断文件大小
varfileSize=formFile.Length;
if(fileSize>1024*1024*10)//10MTODO:(1mb=1024X1024b)
{
returnnewJsonResult(new{isSuccess=false,resultMsg="上传的文件不能大于10M"});
}
//保存的文件名称(以名称和保存时间命名)
varsaveName=formFile.FileName.Substring(0,formFile.FileName.LastIndexOf('.'))+"_"+currentDate.ToString("HHmmss")+fileExtension;
//文件保存
using(varfs=System.IO.File.Create(webRootPath+filePath+saveName))
{
formFile.CopyTo(fs);
fs.Flush();
}
//完整的文件路径
varcompleteFilePath=Path.Combine(filePath,saveName);
returnnewJsonResult(new{isSuccess=true,returnMsg="上传成功",completeFilePath=completeFilePath});
}
else
{
returnnewJsonResult(new{isSuccess=false,resultMsg="上传失败,未检测上传的文件信息~"});
}
}
catch(Exceptionex)
{
returnnewJsonResult(new{isSuccess=false,resultMsg="文件保存失败,异常信息为:"+ex.Message});
}
}
}
}
四、多文件上传:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
usingMicrosoft.AspNetCore.Hosting;
usingMicrosoft.AspNetCore.Http;
usingMicrosoft.AspNetCore.Http.Internal;
usingMicrosoft.AspNetCore.Mvc;
usingMicrosoft.EntityFrameworkCore.Internal;
namespaceFileUploadManage.Controllers
{
///
///图片,视频,音频,文档等相关文件通用上传服务类
///
publicclassFileUploadController:Controller
{
privatestaticIHostingEnvironment_hostingEnvironment;
publicFileUploadController(IHostingEnvironmenthostingEnvironment)
{
_hostingEnvironment=hostingEnvironment;
}
///
///多文件上传
///
///表单集合值
///服务器存储的文件信息
publicJsonResultMultiFileUpload(IFormCollectionformCollection)
{
varcurrentDate=DateTime.Now;
varwebRootPath=_hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("")
varuploadFileRequestList=newList();
try
{
//FormCollection转化为FormFileCollection
varfiles=(FormFileCollection)formCollection.Files;
if(files.Any())
{
foreach(varfileinfiles)
{
varuploadFileRequest=newUploadFileRequest();
varfilePath=$"/UploadFile/{currentDate:yyyyMMdd}/";
//创建每日存储文件夹
if(!Directory.Exists(webRootPath+filePath))
{
Directory.CreateDirectory(webRootPath+filePath);
}
//文件后缀
varfileExtension=Path.GetExtension(file.FileName);//获取文件格式,拓展名
//判断文件大小
varfileSize=file.Length;
if(fileSize>1024*1024*10)//10MTODO:(1mb=1024X1024b)
{
continue;
}
//保存的文件名称(以名称和保存时间命名)
varsaveName=file.FileName.Substring(0,file.FileName.LastIndexOf('.'))+"_"+currentDate.ToString("HHmmss")+fileExtension;
//文件保存
using(varfs=System.IO.File.Create(webRootPath+filePath+saveName))
{
file.CopyTo(fs);
fs.Flush();
}
//完整的文件路径
varcompleteFilePath=Path.Combine(filePath,saveName);
uploadFileRequestList.Add(newUploadFileRequest()
{
FileName=saveName,
FilePath=completeFilePath
});
}
}
else
{
returnnewJsonResult(new{isSuccess=false,resultMsg="上传失败,未检测上传的文件信息~"});
}
}
catch(Exceptionex)
{
returnnewJsonResult(new{isSuccess=false,resultMsg="文件保存失败,异常信息为:"+ex.Message});
}
if(uploadFileRequestList.Any())
{
returnnewJsonResult(new{isSuccess=true,returnMsg="上传成功",filePathArray=uploadFileRequestList});
}
else
{
returnnewJsonResult(new{isSuccess=false,resultMsg="网络打瞌睡了,文件保存失败"});
}
}
}
///
///对文件上传响应模型
///
publicclassUploadFileRequest
{
///
///文件名称
///
publicstringFileName{get;set;}
///
///文件路径
///
publicstringFilePath{get;set;}
}
}
到此这篇关于ASP.NETCore单文件和多文件上传并保存到服务端的方法的文章就介绍到这了,更多相关ASP.NETCore文件上传内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
作者:追逐时光
作者简介:一个热爱编程,善于分享,喜欢学习、探索、尝试新事物,新技术的程序猿。