直接上干货了
1:WebApi后端代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 6 namespace ZRFCoreTestMongoDB.Controllers 7 { 8 using Microsoft.AspNetCore.Authorization; 9 using Microsoft.AspNetCore.Mvc.Filters; 10 using Microsoft.AspNetCore.Mvc; 11 using ZRFCoreTestMongoDB.Model; 12 using ZRFCoreTestMongoDB.Commoms; 13 14 15 using Microsoft.IdentityModel.Tokens; 16 using System.Text; 17 using System.Security.Claims; 18 using System.IdentityModel.Tokens.Jwt; 19 using Microsoft.AspNetCore.Http; 20 using System.IO; 21 using Microsoft.AspNetCore.Hosting; 22 23 24 /// <summary> 25 /// 26 /// </summary> 27 [ApiController] 28 [Route("api/[Controller]")] 29 public class MyJwtTestController : ControllerBase 30 { 31 private readonly JwtConfigModel _jsonmodel; 32 private IWebHostEnvironment _evn; 33 public MyJwtTestController(IWebHostEnvironment evn) 34 { 35 this._evn = evn; 36 _jsonmodel = AppJsonHelper.InitJsonModel(); 37 } 38 39 #region CoreApi文件上传 40 41 [HttpPost, Route("UpFile")] 42 public async Task<ApiResult> UpFile([FromForm]IFormCollection formcollection) 43 { 44 ApiResult result = new ApiResult(); 45 try 46 { 47 var files = formcollection.Files;//formcollection.Count > 0 这样的判断为错误的 48 if (files != null && files.Any()) 49 { 50 var file = files[0]; 51 string contentType = file.ContentType; 52 string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称 53 string fileExtention = Path.GetExtension(fileOrginname); 54 string cdipath = Directory.GetCurrentDirectory(); 55 56 string fileupName = Guid.NewGuid().ToString("d") + fileExtention; 57 string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName); 58 if (!System.IO.File.Exists(upfilePath)) 59 { 60 using var Stream = System.IO.File.Create(upfilePath); 61 } 62 63 #region MyRegion 64 //using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 65 //{ 66 // using (Stream stream = file.OpenReadStream()) //理论上这个方法高效些 67 // { 68 // await stream.CopyToAsync(fileStream);//ok 69 // result.message = "上传成功!"; result.code = statuCode.success; 70 // } 71 //} 72 73 //using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 74 //{ 75 // await file.CopyToAsync(fileStream);//ok 76 // result.message = "上传成功!"; result.code = statuCode.success; 77 //} 78 79 #endregion 80 81 double count = await UpLoadFileStreamHelper.UploadWriteFileAsync(file.OpenReadStream(), upfilePath); 82 result.message = "上传成功!"; result.code = statuCode.success; result.data = $"上传的文件大小为:{count}MB"; 83 } 84 } 85 catch (Exception ex) 86 { 87 result.message = "上传异常,原因:" + ex.Message; 88 } 89 return result; 90 91 } 92 93 /// <summary> 94 /// 文件上传 [FromForm]需要打上这个特性 95 /// </summary> 96 /// <param name="model">上传的字段固定为: file</param> 97 /// <returns></returns> 98 99 [HttpPost, Route("UpFile02")] 100 public async Task<ApiResult> UpFileBymodel([FromForm]UpFileModel model)// 这里一定要加[FromForm]的特性,模型里面可以不用加 101 { 102 ApiResult result = new ApiResult(); 103 try 104 { 105 bool falg = await UpLoadFileStreamHelper.UploadWriteFileByModelAsync(model); 106 result.code = falg ? statuCode.success : statuCode.fail; 107 result.message = falg ? "上传成功" : "上传失败"; 108 } 109 catch (Exception ex) 110 { 111 result.message = "上传异常,原因:" + ex.Message; 112 } 113 return result; 114 } 115 116 [HttpPost, Route("UpFile03")] 117 public async Task<ApiResult> UpFile03(IFormFile file)// 这里一定要加[FromForm]的特性,模型里面可以不用加 118 { 119 ApiResult result = new ApiResult(); 120 try 121 { 122 bool flag = await UpLoadFileStreamHelper.UploadWriteFileAsync(file); 123 result.code = flag ? statuCode.success : statuCode.fail; 124 result.message = flag ? "上传成功" : "上传失败"; 125 } 126 catch (Exception ex) 127 { 128 result.message = "上传异常,原因:" + ex.Message; 129 } 130 return result; 131 } 132 #endregion 133 } 134 }
2: 自定义的json配置文件
1 { 2 3 "upfileInfo": { 4 //上传存放文件的根目录 5 "uploadFilePath": "/Myupfiles/" 6 } 7 }
3:读取自定义的json文件
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 6 namespace ZRFCoreTestMongoDB.Commoms 7 { 8 using ZRFCoreTestMongoDB.Model; 9 using Microsoft.Extensions.Configuration; 10 public class AppJsonHelper 11 { 12 /// <summary> 13 /// 固定的写法 14 /// </summary> 15 /// <returns></returns> 16 public static JwtConfigModel InitJsonModel() 17 { 18 string key = "key_myjsonfilekey"; 19 JwtConfigModel cachemodel = SystemCacheHelper.GetByCache<JwtConfigModel>(key); 20 if (cachemodel == null) 21 { 22 ConfigurationBuilder builder = new ConfigurationBuilder(); 23 var broot = builder.AddJsonFile("./configs/zrfjwt.json").Build(); 24 cachemodel = broot.GetSection("jwtconfig").Get<JwtConfigModel>(); 25 SystemCacheHelper.SetCacheByFile<JwtConfigModel>(key, cachemodel); 26 } 27 return cachemodel; 28 } 29 30 /// <summary> 31 /// 获取到配置文件内容的实体 32 /// </summary> 33 /// <typeparam name="T"></typeparam> 34 /// <param name="jsonName">jason 配置文件中内容节点</param> 35 /// <param name="jsonFilePath">./configs/zrfjwt.json json文件的路径需要始终赋值一下</param> 36 /// <returns></returns> 37 public static T GetJsonModelByFilePath<T>(string jsonName,string jsonFilePath) 38 { 39 if (!string.IsNullOrEmpty(jsonName)) 40 { 41 ConfigurationBuilder builder = new ConfigurationBuilder(); 42 var broot = builder.AddJsonFile(jsonFilePath).Build(); 43 T model = broot.GetSection(jsonName).Get<T>(); 44 return model; 45 } 46 return default; 47 } 48 } 49 }
4:上传文件的测试帮助类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 6 namespace ZRFCoreTestMongoDB.Commoms 7 { 8 using Microsoft.AspNetCore.Http; 9 using Microsoft.AspNetCore.Mvc; 10 using System.IO; 11 using ZRFCoreTestMongoDB.Model; 12 public class UpLoadFileStreamHelper 13 { 14 const int WRITE_FILE_SIZE = 1024 * 1024 * 2; 15 /// <summary> 16 /// 同步上传的方法WriteFile(Stream stream, string path) 17 /// </summary> 18 /// <param name="stream">文件流</param> 19 /// <param name="path">物理路径</param> 20 /// <returns></returns> 21 public static double UploadWriteFile(Stream stream, string path) 22 { 23 try 24 { 25 double writeCount = 0; 26 using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) 27 { 28 Byte[] by = new byte[WRITE_FILE_SIZE]; 29 int readCount = 0; 30 while ((readCount = stream.Read(by, 0, by.Length)) > 0) 31 { 32 fileStream.Write(by, 0, readCount); 33 writeCount += readCount; 34 } 35 return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2); 36 } 37 } 38 catch (Exception ex) 39 { 40 41 throw new Exception("发生异常:" + ex.Message); 42 } 43 } 44 /// <summary> 45 /// WriteFileAsync(Stream stream, string path) 46 /// </summary> 47 /// <param name="stream">文件流</param> 48 /// <param name="path">物理路径</param> 49 /// <returns></returns> 50 public static async Task<double> UploadWriteFileAsync(Stream stream, string path) 51 { 52 try 53 { 54 double writeCount = 0; 55 using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) 56 { 57 Byte[] by = new byte[WRITE_FILE_SIZE]; 58 59 int readCount = 0; 60 while ((readCount = await stream.ReadAsync(by, 0, by.Length)) > 0) 61 { 62 await fileStream.WriteAsync(by, 0, readCount); 63 writeCount += readCount; 64 } 65 } 66 return Math.Round((writeCount * 1.0 / (1024 * 1024)), 2); 67 } 68 catch (Exception ex) 69 { 70 71 throw new Exception("发生异常:" + ex.Message); 72 } 73 } 74 75 /// <summary> 76 /// 上传文件,需要自定义上传的路径 77 /// </summary> 78 /// <param name="file">文件接口对象</param> 79 /// <param name="path">需要自定义上传的路径</param> 80 /// <returns></returns> 81 public static async Task<bool> UploadWriteFileAsync(IFormFile file, string path) 82 { 83 try 84 { 85 using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) 86 { 87 await file.CopyToAsync(fileStream); 88 return true; 89 } 90 } 91 catch (Exception ex) 92 { 93 throw new Exception("发生异常:" + ex.Message); 94 } 95 } 96 97 /// <summary> 98 /// 上传文件,配置信息从自定义的json文件中拿取 99 /// </summary> 100 /// <param name="file"></param> 101 /// <returns></returns> 102 public static async Task<bool> UploadWriteFileAsync(IFormFile file) 103 { 104 try 105 { 106 if (file != null && file.Length > 0) 107 { 108 string contentType = file.ContentType; 109 string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称 110 string fileExtention = Path.GetExtension(fileOrginname);//判断文件的格式是否正确 111 string cdipath = Directory.GetCurrentDirectory(); 112 113 // 可以进一步写入到系统自带的配置文件中 114 UpFIleModelByJson model = AppJsonHelper.GetJsonModelByFilePath<UpFIleModelByJson>("upfileInfo", "./configs/upfile.json"); 115 116 string fileupName = Guid.NewGuid().ToString("d") + fileExtention; 117 string upfilePath = Path.Combine(cdipath + model.uploadFilePath , fileupName);//"/myupfiles/" 可以写入到配置文件中 118 if (!System.IO.File.Exists(upfilePath)) 119 { 120 using var Stream = System.IO.File.Create(upfilePath); 121 } 122 using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, WRITE_FILE_SIZE)) 123 { 124 await file.CopyToAsync(fileStream); 125 return true; 126 } 127 } 128 return false; 129 } 130 catch (Exception ex) 131 { 132 throw new Exception("发生异常:" + ex.Message); 133 } 134 } 135 136 137 public static async Task<bool> UploadWriteFileByModelAsync(UpFileModel model) 138 { 139 try 140 { 141 var files = model.file.Files;// formcollection.Files;//formcollection.Count > 0 这样的判断为错误的 142 if (files != null && files.Any()) 143 { 144 var file = files[0]; 145 string contentType = file.ContentType; 146 string fileOrginname = file.FileName;//新建文本文档.txt 原始的文件名称 147 string fileExtention = Path.GetExtension(fileOrginname);//判断文件的格式是否正确 148 string cdipath = Directory.GetCurrentDirectory(); 149 string fileupName = Guid.NewGuid().ToString("d") + fileExtention; 150 string upfilePath = Path.Combine(cdipath + "/myupfiles/", fileupName);//可以写入到配置文件中 151 if (!System.IO.File.Exists(upfilePath)) 152 { 153 using var Stream = System.IO.File.Create(upfilePath); 154 } 155 using (FileStream fileStream = new FileStream(upfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) 156 { 157 using (Stream stream = file.OpenReadStream()) //理论上这个方法高效些 158 { 159 await stream.CopyToAsync(fileStream); 160 return true; 161 } 162 } 163 } 164 } 165 catch (Exception ex) 166 { 167 throw new Exception("发生异常:" + ex.Message); 168 } 169 return false; 170 } 171 172 /* 173 webapi 端的代码 174 175 [HttpPost, Route("UpFile02")] 176 public async Task<ApiResult> UpFileBymodel([FromForm]UpFileModel model)// 这里一定要加[FromForm]的特性,模型里面可以不用加 177 { 178 ApiResult result = new ApiResult(); 179 try 180 { 181 bool falg = await UpLoadFileStreamHelper.UploadFileByModel(model); 182 result.code = falg ? statuCode.success : statuCode.fail; 183 result.message = falg ? "上传成功" : "上传失败"; 184 } 185 catch (Exception ex) 186 { 187 result.message = "上传异常,原因:" + ex.Message; 188 } 189 return result; 190 } 191 */ 192 } 193 194 public class UpFileModel 195 { 196 public IFormCollection file { get; set; } 197 } 198 }
5:全局大文件上传的使用:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 using Microsoft.AspNetCore.Hosting; 6 using Microsoft.Extensions.Configuration; 7 using Microsoft.Extensions.Hosting; 8 using Microsoft.Extensions.Logging; 9 10 namespace CoreTestMongoDB 11 { 12 public class Program 13 { 14 public static void Main(string[] args) 15 { 16 CreateHostBuilder(args).Build().Run(); 17 } 18 19 public static IHostBuilder CreateHostBuilder(string[] args) => 20 Host.CreateDefaultBuilder(args) 21 .ConfigureWebHostDefaults(webBuilder => 22 { 23 webBuilder.UseStartup<Startup>(); 24 webBuilder.ConfigureKestrel(c => c.Limits.MaxRequestBodySize = 1024 * 1024 * 300); // 全局的大小300M 25 }).UseServiceProviderFactory(new Autofac.Extensions.DependencyInjection.AutofacServiceProviderFactory()); 26 } 27 }
6:最后上传成功的效果截图
7:测试的不同效果截图