应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.net core , .net6,net9,webapi图片上传,多图上传,按照年月来存储图片,按月存储。微信小程序上传图片

104人阅读 2025/3/20 22:38 总访问:5182278 评论:0 收藏:0 手机
分类: .NET

代码如下

  1. /// <summary>
  2. /// 图片上传相关服务
  3. /// </summary>
  4. public class ImgController : FABaseApiController
  5. {
  6. private readonly IWebHostEnvironment _env;
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. /// <param name="env"></param>
  11. public ImgController(IWebHostEnvironment env)
  12. {
  13. _env = env;
  14. }
  15. /// <summary>
  16. /// 图片上传
  17. /// </summary>
  18. /// <returns></returns>
  19. [HttpPost]
  20. public async Task<ObjectResult> UploadImage()
  21. {
  22. // 注意requst的获取,这里自己封装了一层BaseApiController所以使用base.HttpContext.Request获取
  23. // var request = HttpContext.Request;
  24. var request = HttpContext.Request;
  25. IFormFileCollection upfiles = request.Form.Files;
  26. if (upfiles == null || upfiles.Count == 0)
  27. {
  28. return Failed("未选择任何文件");
  29. }
  30. // 只取第一个文件
  31. IFormFile firstFile = upfiles.First();
  32. // 使用注入的_env获取路径
  33. string uploadDir = Path.Combine(_env.WebRootPath, "imgs", "uploadimgs");
  34. // 创建月度子目录
  35. string monthlyFolder = DateTime.Now.ToString("yyyy-MM");
  36. string fullPath = Path.Combine(uploadDir, monthlyFolder);
  37. if (!Directory.Exists(fullPath))
  38. {
  39. Directory.CreateDirectory(fullPath);
  40. }
  41. try
  42. {
  43. // 验证文件类型
  44. var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".webp" };
  45. var fileExt = Path.GetExtension(firstFile.FileName).ToLowerInvariant();
  46. if (firstFile.Length == 0 || !allowedExtensions.Contains(fileExt))
  47. {
  48. return Failed("不支持的文件类型或空文件");
  49. }
  50. if (firstFile.Length > 10 * 1024 * 1024)
  51. {
  52. return Failed("单个文件大小不能超过10MB");
  53. }
  54. // 生成唯一文件名
  55. string fileName = $"{Guid.NewGuid():N}{fileExt}";
  56. string filePath = Path.Combine(fullPath, fileName);
  57. // 使用异步写入提高性能
  58. using (var stream = new FileStream(filePath, FileMode.Create))
  59. {
  60. await firstFile.CopyToAsync(stream);
  61. await stream.FlushAsync();
  62. }
  63. // 返回带完整访问路径的结果
  64. string baseUri = $"{Request.Scheme}://{Request.Host}/imgs/uploadimgs/{monthlyFolder}/";
  65. string shortBaseUrl = $"/imgs/uploadimgs/{monthlyFolder}/";
  66. var result = new
  67. {
  68. fileName = fileName,
  69. monthlyFolderName = monthlyFolder,
  70. fileNameAndFolderName = $"{monthlyFolder}/{fileName}",
  71. shortFileUrl = shortBaseUrl + fileName,
  72. fileUrl = baseUri + fileName,
  73. // size = firstFile.Length
  74. };
  75. return Success(result);
  76. }
  77. catch (Exception ex)
  78. {
  79. // 记录错误日志(建议添加日志记录)
  80. return Failed($"上传失败: {ex.Message}");
  81. }
  82. }
  83. /// <summary>
  84. /// 多图上传
  85. /// </summary>
  86. /// <returns></returns>
  87. [HttpPost]
  88. public async Task<ObjectResult> UploadImageMany()
  89. {
  90. // 注意requst的获取,这里自己封装了一层BaseApiController所以使用base.HttpContext.Request获取
  91. // var request = HttpContext.Request;
  92. var request = base.HttpContext.Request;
  93. IFormFileCollection upfiles = request.Form.Files;
  94. if (upfiles == null || upfiles.Count == 0)
  95. {
  96. return Failed("未选择任何文件");
  97. }
  98. // 获取安全的物理路径(跨平台兼容)
  99. string uploadDir = Path.Combine(_env.WebRootPath, "imgs", "uploadimgs");
  100. // 创建月度子目录
  101. string monthlyFolder = DateTime.Now.ToString("yyyy-MM");
  102. string fullPath = Path.Combine(uploadDir, monthlyFolder);
  103. if (!Directory.Exists(fullPath))
  104. {
  105. Directory.CreateDirectory(fullPath);
  106. }
  107. List<string> savedFiles = new();
  108. foreach (IFormFile formFile in upfiles)
  109. {
  110. // 验证文件类型
  111. var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".webp" };
  112. var fileExt = Path.GetExtension(formFile.FileName).ToLowerInvariant();
  113. if (formFile.Length == 0 || !allowedExtensions.Contains(fileExt))
  114. {
  115. continue; // 跳过无效文件
  116. }
  117. if (formFile.Length > 10 * 1024 * 1024)
  118. {
  119. return Failed("单个文件大小不能超过10MB");
  120. }
  121. try
  122. {
  123. // 生成唯一文件名
  124. string fileName = $"{Guid.NewGuid():N}{fileExt}";
  125. string filePath = Path.Combine(fullPath, fileName);
  126. // 使用异步写入提高性能
  127. using (var stream = new FileStream(filePath, FileMode.Create))
  128. {
  129. await formFile.CopyToAsync(stream);
  130. await stream.FlushAsync();
  131. }
  132. savedFiles.Add(fileName);
  133. }
  134. catch (Exception ex)
  135. {
  136. // 记录错误日志(建议添加日志记录)
  137. return Failed($"上传失败: {ex.Message}");
  138. }
  139. }
  140. if (savedFiles.Count == 0)
  141. {
  142. return Failed("没有有效的图片文件");
  143. }
  144. // 返回带完整访问路径的结果(根据实际需求调整)
  145. string baseUri = $"{Request.Scheme}://{Request.Host}/imgs/uploadimgs/{monthlyFolder}/";
  146. string shortBaseUrl = $"/imgs/uploadimgs/{monthlyFolder}/";
  147. var result = savedFiles.Select(f => new
  148. {
  149. fileName = f,
  150. shortFileUrl = shortBaseUrl + f,
  151. fileUrl = baseUri + f,
  152. });
  153. return Success(result);
  154. }
  155. }

uni-app,微信小程序端调用测试

  1. // 上传清洗前照片
  2. const uploadBeforeImage = () => {
  3. uni.chooseImage({
  4. count: 1,
  5. success: (res) => {
  6. beforeImages.value.push(res.tempFilePaths[0]);
  7. console.log("开始上传图了!");
  8. uploadFile(res.tempFilePaths[0]);
  9. },
  10. });
  11. };
  12. const uploadFile = (_filePath:any)=>{
  13. uni.uploadFile({
  14. // 请求接口地址
  15. url: ApiBaseUrl + '/watertap/api/Img/UploadImage',
  16. filePath: _filePath,
  17. name: 'file',
  18. header: {
  19. 'Authorization': `Bearer ${getToken()}`,
  20. },
  21. // 除了图片上传的额外数据
  22. formData: {
  23. 'bucketName': 'WaterTapCollection',
  24. 'filePath': 'WaterTapCollection',
  25. 'fileType': '1'
  26. },
  27. success: (uploadFileRes:any) => {
  28. // 下面是图片上传成功之后配合其他接口的操作
  29. // state.UpLoadData.Sign = result.data.id
  30. // submitUpload()
  31. }
  32. });
  33. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

图片上传的安全校验

记个笔记控制层用的框架SpringMVC上传文件时,后台使用MultipartFile对象接收,前台action的enctype属性必须设置为multipart/...

百度编辑器图片上传

先在百度编辑器配置好上传图片的后台地址serverUrl:&#39;图片上传的后台地址&#39;varue=UE.getEditor(&quot;container&quot...

使用markdown编辑器editormd图片上传

静态资源路径问题可以参考:https://www.tnblog.net/aojiancc2/article/details/3436自定义工具栏可以参考:https://www.tn...

vue elementuivue3 element plus 文件上传的时候设置其他参数后台.net接收传递的额外参数图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue3 图片上传文件上传视频上传图片预览视频预览

直接调用接口上传参考:https://www.tnblog.net/notebook/article/details/8495[TOC]基础的图片上传,文件上传,视频上传界...

vue3 微信小程序 uniapp图片上传图片转base64base64转图片

vue3 微信小程序 uniapp 图片上传uni-app中上传图片可以使用方法uni.uploadFile:uni.uploadFile官方文档:https://uniapp.d...

vue vue3 Tinymce 图片上传 复制粘贴图片

[TOC]上传图片,首先要启用图片插件在plugins参数中把image加进去 在工具栏显示图片工具按钮,在toolbar参数中把image加进...

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

网页上传文件断点续传的实现无视文件大小上传以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...