.net core , .net6,net9,webapi图片上传,多图上传,按照年月来存储图片,按月存储。微信小程序上传图片 电脑版发表于:2025/3/20 22:38 [TOC] ### 代码如下 ``` /// <summary> /// 图片上传相关服务 /// </summary> public class ImgController : FABaseApiController { private readonly IWebHostEnvironment _env; /// <summary> /// /// </summary> /// <param name="env"></param> public ImgController(IWebHostEnvironment env) { _env = env; } /// <summary> /// 图片上传 /// </summary> /// <returns></returns> [HttpPost] public async Task<ObjectResult> UploadImage() { // 注意requst的获取,这里自己封装了一层BaseApiController所以使用base.HttpContext.Request获取 // var request = HttpContext.Request; var request = HttpContext.Request; IFormFileCollection upfiles = request.Form.Files; if (upfiles == null || upfiles.Count == 0) { return Failed("未选择任何文件"); } // 只取第一个文件 IFormFile firstFile = upfiles.First(); // 使用注入的_env获取路径 string uploadDir = Path.Combine(_env.WebRootPath, "imgs", "uploadimgs"); // 创建月度子目录 string monthlyFolder = DateTime.Now.ToString("yyyy-MM"); string fullPath = Path.Combine(uploadDir, monthlyFolder); if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } try { // 验证文件类型 var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".webp" }; var fileExt = Path.GetExtension(firstFile.FileName).ToLowerInvariant(); if (firstFile.Length == 0 || !allowedExtensions.Contains(fileExt)) { return Failed("不支持的文件类型或空文件"); } if (firstFile.Length > 10 * 1024 * 1024) { return Failed("单个文件大小不能超过10MB"); } // 生成唯一文件名 string fileName = $"{Guid.NewGuid():N}{fileExt}"; string filePath = Path.Combine(fullPath, fileName); // 使用异步写入提高性能 using (var stream = new FileStream(filePath, FileMode.Create)) { await firstFile.CopyToAsync(stream); await stream.FlushAsync(); } // 返回带完整访问路径的结果 string baseUri = $"{Request.Scheme}://{Request.Host}/imgs/uploadimgs/{monthlyFolder}/"; string shortBaseUrl = $"/imgs/uploadimgs/{monthlyFolder}/"; var result = new { fileName = fileName, monthlyFolderName = monthlyFolder, fileNameAndFolderName = $"{monthlyFolder}/{fileName}", shortFileUrl = shortBaseUrl + fileName, fileUrl = baseUri + fileName, // size = firstFile.Length }; return Success(result); } catch (Exception ex) { // 记录错误日志(建议添加日志记录) return Failed($"上传失败: {ex.Message}"); } } /// <summary> /// 多图上传 /// </summary> /// <returns></returns> [HttpPost] public async Task<ObjectResult> UploadImageMany() { // 注意requst的获取,这里自己封装了一层BaseApiController所以使用base.HttpContext.Request获取 // var request = HttpContext.Request; var request = base.HttpContext.Request; IFormFileCollection upfiles = request.Form.Files; if (upfiles == null || upfiles.Count == 0) { return Failed("未选择任何文件"); } // 获取安全的物理路径(跨平台兼容) string uploadDir = Path.Combine(_env.WebRootPath, "imgs", "uploadimgs"); // 创建月度子目录 string monthlyFolder = DateTime.Now.ToString("yyyy-MM"); string fullPath = Path.Combine(uploadDir, monthlyFolder); if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } List<string> savedFiles = new(); foreach (IFormFile formFile in upfiles) { // 验证文件类型 var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".webp" }; var fileExt = Path.GetExtension(formFile.FileName).ToLowerInvariant(); if (formFile.Length == 0 || !allowedExtensions.Contains(fileExt)) { continue; // 跳过无效文件 } if (formFile.Length > 10 * 1024 * 1024) { return Failed("单个文件大小不能超过10MB"); } try { // 生成唯一文件名 string fileName = $"{Guid.NewGuid():N}{fileExt}"; string filePath = Path.Combine(fullPath, fileName); // 使用异步写入提高性能 using (var stream = new FileStream(filePath, FileMode.Create)) { await formFile.CopyToAsync(stream); await stream.FlushAsync(); } savedFiles.Add(fileName); } catch (Exception ex) { // 记录错误日志(建议添加日志记录) return Failed($"上传失败: {ex.Message}"); } } if (savedFiles.Count == 0) { return Failed("没有有效的图片文件"); } // 返回带完整访问路径的结果(根据实际需求调整) string baseUri = $"{Request.Scheme}://{Request.Host}/imgs/uploadimgs/{monthlyFolder}/"; string shortBaseUrl = $"/imgs/uploadimgs/{monthlyFolder}/"; var result = savedFiles.Select(f => new { fileName = f, shortFileUrl = shortBaseUrl + f, fileUrl = baseUri + f, }); return Success(result); } } ``` ### uni-app,微信小程序端调用测试 ``` // 上传清洗前照片 const uploadBeforeImage = () => { uni.chooseImage({ count: 1, success: (res) => { beforeImages.value.push(res.tempFilePaths[0]); console.log("开始上传图了!"); uploadFile(res.tempFilePaths[0]); }, }); }; const uploadFile = (_filePath:any)=>{ uni.uploadFile({ // 请求接口地址 url: ApiBaseUrl + '/watertap/api/Img/UploadImage', filePath: _filePath, name: 'file', header: { 'Authorization': `Bearer ${getToken()}`, }, // 除了图片上传的额外数据 formData: { 'bucketName': 'WaterTapCollection', 'filePath': 'WaterTapCollection', 'fileType': '1' }, success: (uploadFileRes:any) => { // 下面是图片上传成功之后配合其他接口的操作 // state.UpLoadData.Sign = result.data.id // submitUpload() } }); } ```