public async Task <IActionResult> UpImage([FromForm] UploadModel model) { if (!ModelState.IsValid) { ApiData.code = 1005; ApiData.msg = ModelState.GetErrMsg(); return(Ok(ApiData)); } if (Request.Form.Files == null || Request.Form.Files.Count == 0 || !Request.Form.Files[0].IsImage()) { ApiData.code = 1006; ApiData.msg = "请上传图片文件"; return(Ok(ApiData)); } var bucket = _bucketService.GetBucketBayName(model.bucket); if (bucket == null) { ApiData.code = 2001; ApiData.msg = "bucket错误"; return(Ok(ApiData)); } IFormFile file = Request.Form.Files[0]; string sha1 = file.GetSHA1(); var item = _bucketImageService.GetSHA1(sha1); if (item != null) { ApiData.code = 0; ApiData.msg = "上传成功"; ApiData.data = new { url = $"/oss/imagecn{item.visiturl}" }; return(Ok(ApiData)); } if (!ValidSignature(model.signature, file.GetMD5(), model.VERB)) { ApiData.code = 1005; ApiData.msg = "签名验证失败"; return(Ok(ApiData)); } uint crc32 = Crc32Algorithm.Compute(EncryptorHelper.GetMD5Byte(Guid.NewGuid().ToString())); var dir = Math.Abs(crc32) % 256;//256个子目录 string f_dir = Math.Abs(crc32).ToString(); string path = System.IO.Path.Combine(MediaItemConfig.RootDir, bucket.name, dir.ToString(), f_dir); //保存文件并且获取文件的相对存储路径 var image = file.CreateImagePathFromStream(_mediaItemStorage, path); string visiturl = $"/oss/imagecn/{bucket.name}/{dir}/{f_dir}/{image.NewFileName}"; _bucketImageService.AddImage(new Entities.bucket_image() { id = CombGuid.NewGuidAsString(), bucket_id = bucket.id, creation_time = DateTime.Now, ext_name = image.ExtName, sha1 = sha1, visiturl = visiturl, io_path = image.IOPath, width = image.Width, height = image.Height, length = file.Length }); ApiData.code = 0; ApiData.msg = "上传成功"; ApiData.data = new { url = visiturl }; await Task.FromResult(0); return(Ok(ApiData)); }