直接上干货了
1:WebApi后端代码2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZRFCoreTestMongoDB.Controllers
{
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using ZRFCoreTestMongoDB.Model;
using ZRFCoreTestMongoDB.Commoms;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.Security.Claims;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.AspNetCore.Http;
using System.IO;
using Microsoft.AspNetCore.Hosting;
///
///
///
[ApiController]
[Route("api/[Controller]")]
public class MyJwtTestController : ControllerBase
{
private readonly JwtConfigModel _jsonmodel;
private IWebHostEnvironment _evn;
public MyJwtTestController(IWebHostEnvironment evn)
{
this._evn = evn;
_jsonmodel = AppJsonHelper.InitJsonModel();
}
#region CoreApi文件上传
[HttpPost, Route("UpFile")]
public async Task UpFile([FromForm]IFormCollection formcollection)
{
ApiResult result = new ApiResult();
try
{
var files = formcollection.Files;//formcollection.Count > 0 这样的判断为错误的
if (files != null && files.Any())
{
var file = files[0];
string contentType = file.ContentType;
string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称
string fileExtention = Path.GetExtension(fileOrginname);
string cdipath = Directory.GetCurrentDirectory();
string fileupName = Guid.NewGuid().ToString("d") + fileExtention;
string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName);
if (!System.IO.File.Exists(upfilePath))
{
using var Stream = System.IO.File.Create(upfilePath);
}
#region MyRegion
//using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
//{
// using (Stream stream = file.OpenReadStream()) //理论上这个方法高效些
// {
// await stream.CopyToAsync(fileStream);//ok
// result.message = "上传成功!"; result.code = statuCode.success;
// }
//}
//using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
//{
// await file.CopyToAsync(fileStream);//ok
// result.message = "上传成功!"; result.code = statuCode.success;
//}
#endregion
double count = await UpLoadFileStreamHelper.UploadWriteFileAsync(file.OpenReadStream(), upfilePath);
result.message = "上传成功!"; result.code = statuCode.success; result.data = $"上传的文件大小为:{count}MB";
}
}
catch (Exception ex)
{
result.message = "上传异常,原因:" + ex.Message;
}
return result;
}
///
/// 文件上传 [FromForm]需要打上这个特性
///
/// 上传的字段固定为: file
///
[HttpPost, Route("UpFile02")]
public async Task UpFileBymodel([FromForm]UpFileModel model)// 这里一定要加[FromForm]的特性,模型里面可以不用加
{
ApiResult result = new ApiResult();
try
{
bool falg = await UpLoadFileStreamHelper.UploadWriteFileByModelAsync(model);
result.code = falg ? statuCode.success : statuCode.fail;
result.message = falg ? "上传成功" : "上传失败";
}
catch (Exception ex)
{
result.message = "上传异常,原因:" + ex.Message;
}
return result;
}
[HttpPost, Route("UpFile03")]
public async Task UpFile03(IFormFile file)// 这里一定要加[FromForm]的特性,模型里面可以不用加
{
ApiResult result = new ApiResult();
try
{
bool flag = await UpLoadFileStreamHelper.UploadWriteFileAsync(file);
result.code = flag ? statuCode.success : statuCode.fail;
result.message = flag ? "上传成功" : "上传失败";
}
catch (Exception ex)
{
result.message = "上传异常,原因:" + ex.Message;
}
return result;
}
#endregion
}
}
自定义的json配置文件
{
"upfileInfo": {
//上传存放文件的根目录
"uploadFilePath": "/Myupfiles/"
}
}
3:读取自定义的json文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZRFCoreTestMongoDB.Commoms
{
using ZRFCoreTestMongoDB.Model;
using Microsoft.Extensions.Configuration;
public class AppJsonHelper
{
///
/// 固定的写法
///
///
public static JwtConfigModel InitJsonModel()
{
string key = "key_myjsonfilekey";
JwtConfigModel cachemodel = SystemCacheHelper.GetByCache(key);
if (cachemodel == null)
{
ConfigurationBuilder builder = new ConfigurationBuilder();
var broot = builder.AddJsonFile("./configs/zrfjwt.json").Build();
cachemodel = broot.GetSection("jwtconfig").Get();
SystemCacheHelper.SetCacheByFile(key, cachemodel);
}
return cachemodel;
}
///
/// 获取到配置文件内容的实体
///
///
/// jason 配置文件中内容节点
/// ./configs/zrfjwt.json json文件的路径需要始终赋值一下
///
public static T GetJsonModelByFilePath(string jsonName,string jsonFilePath)
{
if (!string.IsNullOrEmpty(jsonName))
{
ConfigurationBuilder builder = new ConfigurationBuilder();
var broot = builder.AddJsonFile(jsonFilePath).Build();
T model = broot.GetSection(jsonName).Get();
return model;
}
return default;
}
}
}
4:上传文件的测试帮助类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZRFCoreTestMongoDB.Commoms
{
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using ZRFCoreTestMongoDB.Model;
public class UpLoadFileStreamHelper
{
const int WRITE_FILE_SIZE = 1024 * 1024 * 2;
///
/// 同步上传的方法WriteFile(Stream stream, string path)
///
/// 文件流
/// 物理路径
///
public static double UploadWriteFile(Stream stream, string path)
{
try
{
double writeCount = 0;
using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE))
{
Byte[] by = new byte[WRITE_FILE_SIZE];
int readCount = 0;
while ((readCount = stream.Read(by, 0, by.Length)) > 0)
{
fileStream.Write(by, 0, readCount);
writeCount += readCount;
}
return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2);
}
}
catch (Exception ex)
{
throw new Exception("发生异常:" + ex.Message);
}
}
///
/// WriteFileAsync(Stream stream, string path)
///
/// 文件流
/// 物理路径
///
public static async Task UploadWriteFileAsync(Stream stream, string path)
{
try
{
double writeCount = 0;
using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE))
{
Byte[] by = new byte[WRITE_FILE_SIZE];
int readCount = 0;
while ((readCount = await stream.ReadAsync(by, 0, by.Length)) > 0)
{
await fileStream.WriteAsync(by, 0, readCount);
writeCount += readCount;
}
}
return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2);
}
catch (Exception ex)
{
throw new Exception("发生异常:" + ex.Message);
}
}
///
/// 上传文件,需要自定义上传的路径
///
/// 文件接口对象
/// 需要自定义上传的路径
///
public static async Task UploadWriteFileAsync(IFormFile file, string path)
{
try
{
using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE))
{
await file.CopyToAsync(fileStream);
return true;
}
}
catch (Exception ex)
{
throw new Exception("发生异常:" + ex.Message);
}
}
///
/// 上传文件,配置信息从自定义的json文件中拿取
///
///
///
public static async Task UploadWriteFileAsync(IFormFile file)
{
try
{
if (file != null && file.Length > 0)
{
string contentType = file.ContentType;
string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称
string fileExtention = Path.GetExtension(fileOrginname);//判断文件的格式是否正确
string cdipath = Directory.GetCurrentDirectory();
// 可以进一步写入到系统自带的配置文件中
UpFIleModelByJson model = AppJsonHelper.GetJsonModelByFilePath("upfileInfo", "./configs/upfile.json");
string fileupName = Guid.NewGuid().ToString("d") + fileExtention;
string upfilePath = Path.Combine(cdipath + model.uploadFilePath , fileupName);//"/myupfiles/" 可以写入到配置文件中
if (!System.IO.File.Exists(upfilePath))
{
using var Stream = System.IO.File.Create(upfilePath);
}
using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE))
{
await file.CopyToAsync(fileStream);
return true;
}
}
return false;
}
catch (Exception ex)
{
throw new Exception("发生异常:" + ex.Message);
}
}
public static async Task UploadWriteFileByModelAsync(UpFileModel model)
{
try
{
var files = model.file.Files;// formcollection.Files;//formcollection.Count > 0 这样的判断为错误的
if (files != null && files.Any())
{
var file = files[0];
string contentType = file.ContentType;
string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称
string fileExtention = Path.GetExtension(fileOrginname);//判断文件的格式是否正确
string cdipath = Directory.GetCurrentDirectory();
string fileupName = Guid.NewGuid().ToString("d") + fileExtention;
string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName);//可以写入到配置文件中
if (!System.IO.File.Exists(upfilePath))
{
using var Stream = System.IO.File.Create(upfilePath);
}
using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (Stream stream = file.OpenReadStream()) //理论上这个方法高效些
{
await stream.CopyToAsync(fileStream);
return true;
}
}
}
}
catch (Exception ex)
{
throw new Exception("发生异常:" + ex.Message);
}
return false;
}
/*
webapi 端的代码
[HttpPost, Route("UpFile02")]
public async Task UpFileBymodel([FromForm]UpFileModel model)// 这里一定要加[FromForm]的特性,模型里面可以不用加
{
ApiResult result = new ApiResult();
try
{
bool falg = await UpLoadFileStreamHelper.UploadFileByModel(model);
result.code = falg ? statuCode.success : statuCode.fail;
result.message = falg ? "上传成功" : "上传失败";
}
catch (Exception ex)
{
result.message = "上传异常,原因:" + ex.Message;
}
return result;
}
*/
}
public class UpFileModel
{
public IFormCollection file { get; set; }
}
}
5:全局大文件上传的使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace CoreTestMongoDB
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
webBuilder.ConfigureKestrel(c => c.Limits.MaxRequestBodySize = 1024 * 1024 * 300); // 全局的大小300M
}).UseServiceProviderFactory(new Autofac.Extensions.DependencyInjection.AutofacServiceProviderFactory());
}
}
6:最后上传成功的效果截图
7:测试的不同效果截图