.NET6+Swagger调用WebAPI接口使用FormData上传图片到服务器

一、控制器代码

        /// <summary>
        ///上传图片到服务器,调用后台管理的上传图片接口
        /// </summary>
        /// <param name="files">表单文件信息</param>
        /// <returns></returns>
        [HttpPost("UploadImage")]
        [AllowAnonymous]
        public IActionResult UploadImage(IFormFile files)
        {
            try
            {
                if (files.Length <= 0)
                {
                    return Ok(new { Code = 400, Msg = "请选择要上传的图片!" });
                }
                var fileBytes = ReadFileBytes(files);
                var fileExtension = Path.GetExtension(files.FileName);//获取文件格式,拓展名
                var result = HttpClientHelper._.HttpClientPost("上传图片URL", fileBytes, fileExtension, files.FileName);
                var resultObj = JsonConvert.DeserializeObject<UploadResult>(result);
                if (resultObj != null)
                {
                    if (resultObj.code == 200)
                    {
                        return Ok(new { Code = resultObj.code, Msg = resultObj.Msg, ImgUrl = resultObj.data, ImgName = resultObj.imgname });
                    }
                    else
                    {
                        return Ok(new { code = 400, msg = resultObj.Msg });
                    }
                }
                else 
                {
                    return Ok(new { code = 400, msg ="上传失败!"});
                }
            }
            catch (Exception e)
            {
                return Ok(new { code = 400, msg = e.Message });
            }
        }
        /// <summary>
        /// 文件流类型转化字节类型
        /// </summary>
        /// <param name="fileData">表单文件信息</param>
        /// <returns></returns>
        private byte[] ReadFileBytes(IFormFile fileData)
        {
            byte[] data;
            using (Stream inputStream = fileData.OpenReadStream())//读取上传文件的请求流
            {
                MemoryStream memoryStream = inputStream as MemoryStream;
                if (memoryStream == null)
                {
                    memoryStream = new MemoryStream();
                    inputStream.CopyTo(memoryStream);
                }
                data = memoryStream.ToArray();
            }
            return data;
        }

二、新建返回结果类UploadResult

 /// <summary>
    /// 上传响应模型
    /// </summary>
    public class UploadResult
    {
        /// <summary>
        /// code
        /// </summary>
        public int code { get; set; }

        /// <summary>
        /// 结果
        /// </summary>
        public string Msg { get; set; }
        /// <summary> 
        /// 图片地址
        /// </summary>
        public string data { get; set; }
        /// <summary>
        /// 图片名称
        /// </summary>
        public string imgname { get; set; }
    }

三、新建Http网络请求帮助类HttpClientHelper

    public class HttpClientHelper
    {
        private static HttpClientHelper _httpClientHelper;

        public static HttpClientHelper _
        {
            get => _httpClientHelper ?? (_httpClientHelper = new HttpClientHelper());
            set => _httpClientHelper = value;
        }

        /// <summary>
        /// 向目标地址提交图片文件参数数据
        /// </summary>
        /// <param name="requestUrl">请求地址</param>
        /// <param name="bmpBytes">图片字节流</param>
        /// <param name="imgType">上传图片类型</param>
        /// <param name="fileName">图片名称</param>
        /// <returns></returns>
        public string HttpClientPost(string requestUrl, byte[] bmpBytes, string imgType, string fileName)
        {
            using (var httpClient = new HttpClient())
            {
                List<ByteArrayContent> byteArrayContents = new List<ByteArrayContent>();

                var imgTypeContent = new ByteArrayContent(Encoding.UTF8.GetBytes(imgType));
                imgTypeContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "imgType"
                };
                byteArrayContents.Add(imgTypeContent);

                var fileContent = new ByteArrayContent(bmpBytes);//填充图片文件二进制字节
                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = "file",
                    FileName = fileName
                };
                byteArrayContents.Add(fileContent);

                var content = new MultipartFormDataContent();
                //将ByteArrayContent集合加入到MultipartFormDataContent中
                foreach (var byteArrayContent in byteArrayContents)
                {
                    content.Add(byteArrayContent);
                }

                try
                {
                    var result = httpClient.PostAsync(requestUrl, content).Result;//post请求
                    return result.Content.ReadAsStringAsync().Result;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
        }
    }

四、调用的接口

 [HttpPost("UploadImage")]
        public IActionResult UploadImage([FromForm] IFormCollection formData)
        {
            try
            {
                var files = Request.Form.Files;
                if (files.Count == 0)
                {
                    return new JsonResult(new { code = 400, Msg = "没有选择的图片!" });
                }
                var file = files[0];
                string fileName = file.FileName;
                if (string.IsNullOrEmpty(fileName))//服务器是否存在该文件
                {
                    return new JsonResult(new { code = 400, Msg = "服务器上已存在该图片!" });
                }
                // 获取上传的图片名称和扩展名称
                string fileFullName = Path.GetFileName(file.FileName);
                string fileExtName = Path.GetExtension(fileFullName);
                var fileExtNames = Configuration["UploadImgURL:FileExtName"].ToString().Split(',');
                if (!fileExtNames.Contains(fileExtName))
                {
                    return new JsonResult(new { code = 400, Msg = "选择的文件不是图片的格式!"});
                }
                //获取当前项目所在的路径
                string imgPath = Configuration["UploadImgURL:ImgURLAPI"];
                //生成随机数
                Random rd = new Random();
                int num = rd.Next(1000, 10000);
                var newPath = "LKImages" + num + System.DateTime.UtcNow.Ticks + fileExtName;
                var src = imgPath + newPath;
                // 如果目录不存在则要先创建
                if (!Directory.Exists(imgPath))
                {
                    Directory.CreateDirectory(imgPath);
                }
                using (FileStream fs = System.IO.File.Create(src))
                {
                    file.CopyTo(fs);
                    fs.Flush();
                }

                string PathSrc = Configuration["UploadImgURL:ImgURL"] + newPath;
                return new JsonResult(new { code = 200, data = PathSrc, imgname = newPath, Msg = "上传成功!" });
            }
            catch (Exception e)
            {
                return new JsonResult(new { code = 400, Msg = "上传失败!"+e.Message });
            }
        }

appsettings.json配置代码

 //上传图片路径
  "UploadImgURL": {
    "ImgURLAPI": "wwwroot/UploadFile/ApiImages/",
    "FileExtName": ".jpg,.png,.bmp",
    "ImgURL": "/UploadFile/ApiImages/"
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值