标签:文件上传 ODB form files flag string cep uri end
asp.net core Webapi是有多种上传文件的方法的 另外swagger ui也可以选择文件来上传文件
下面直接上code
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 ///
25 ///
26 ///
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 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 ///
94 /// 文件上传 [FromForm]需要打上这个特性
95 ///
96 /// 上传的字段固定为: file
97 ///
98
99 [HttpPost, Route("UpFile02")]
100 public async Task 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 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 }
View Code
2: 自定义的json配置文件
1 {
2
3 "upfileInfo": {
4 //上传存放文件的根目录
5 "uploadFilePath": "/Myupfiles/"
6 }
7 }
View Code
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 ///
13 /// 固定的写法
14 ///
15 ///
16 public static JwtConfigModel InitJsonModel()
17 {
18 string key = "key_myjsonfilekey";
19 JwtConfigModel cachemodel = SystemCacheHelper.GetByCache(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();
25 SystemCacheHelper.SetCacheByFile(key, cachemodel);
26 }
27 return cachemodel;
28 }
29
30 ///
31 /// 获取到配置文件内容的实体
32 ///
33 ///
34 /// jason 配置文件中内容节点
35 /// ./configs/zrfjwt.json json文件的路径需要始终赋值一下
36 ///
37 public static T GetJsonModelByFilePath(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();
44 return model;
45 }
46 return default;
47 }
48 }
49 }
View Code
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 ///
16 /// 同步上传的方法WriteFile(Stream stream, string path)
17 ///
18 /// 文件流
19 /// 物理路径
20 ///
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 ///
45 /// WriteFileAsync(Stream stream, string path)
46 ///
47 /// 文件流
48 /// 物理路径
49 ///
50 public static async Taskdouble> 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 ///
76 /// 上传文件,需要自定义上传的路径
77 ///
78 /// 文件接口对象
79 /// 需要自定义上传的路径
80 ///
81 public static async Taskbool> 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 ///
98 /// 上传文件,配置信息从自定义的json文件中拿取
99 ///
100 ///
101 ///
102 public static async Taskbool> 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("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 Taskbool> 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 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 }
View Code
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();
24 webBuilder.ConfigureKestrel(c => c.Limits.MaxRequestBodySize = 1024 * 1024 * 300); // 全局的大小300M
25 }).UseServiceProviderFactory(new Autofac.Extensions.DependencyInjection.AutofacServiceProviderFactory());
26 }
27 }
View Code
6:最后上传成功的效果截图
7:测试的不同效果截图
asp.net core Webapi 3.1 上传文件的多种方法(附大文件上传) 以及swagger ui 上传文件
标签:文件上传 ODB form files flag string cep uri end
原文地址:https://www.cnblogs.com/Fengge518/p/13404119.html